JVM内存模型总体架构图

程序计数器
多线程时,当线程数超过CPU数量或CPU内核数量,线程之间就要根据时间片轮询抢夺CPU时间资源。因此每个线程有要有一个独立的程序计数器,记录下一条要运行的指令。线程私有的内存区域。如果执行的是JAVA方法,计数器记录正在执行的java字节码地址,如果执行的是native方法,则计数器为空。

虚拟机栈(栈内存)
线程私有的,与线程在同一时间创建。管理JAVA方法执行的内存模型。每个方法执行时都会创建一个桢栈来存储方法的的变量表、操作数栈、动态链接方法、返回值、返回地址等信息。栈的大小决定了方法调用的可达深度(递归多少层次,或嵌套调用多少层其他方法,-Xss参数可以设置虚拟机栈大小)。栈的大小可以是固定的,或者是动态扩展的。如果请求的栈深度大于最大可用深度,则抛出stackOverflowError;如果栈是可动态扩展的,但没有内存空间支持扩展,则抛出OutofMemoryError。

本地方法区
和虚拟机栈功能相似,但管理的不是JAVA方法,是本地方法,本地方法是用C实现的。

JAVA堆
线程共享的,存放所有对象实例和数组。垃圾回收的主要区域。可以分为新生代和老年代(tenured)。
新生代用于存放刚创建的对象以及年轻的对象,如果对象一直没有被回收,生存得足够长,老年对象就会被移入老年代。
新生代又可进一步细分为eden、survivorSpace0(s0,from space)、survivorSpace1(s1,to space)。刚创建的对象都放入eden,s0和s1都至少经过一次GC并幸存。如果幸存对象经过一定时间仍存在,则进入老年代(tenured)。

方法区(永久代)
线程共享的,用于存放被虚拟机加载的类的元数据信息:如常量、静态变量、即时编译器编译后的代码。也成为永久代。如果hotspot虚拟机确定一个类的定义信息不会被使用,也会将其回收。回收的基本条件至少有:所有该类的实例被回收,而且装载该类的ClassLoader被回收。方法区存储了下面两种类型的数据:

1.Class的节本信息

Package Name
Super class package name
Class or interface
Type modifiers
Super inferface package name

2.其它信息

The constant pool for the type
Field information
Method information
All class (static) variables declared
in the type, except constants
A reference to class ClassLoader
A reference to class Class

SUN设计的时候认为这个区域在JVM启动的时候就固定了,但他没有想到现在动态会用得这么广泛。而且这个区域有特殊的垃圾收回机制,现在的问题是动态加载类到这个区域后,gc根本没办法回收!

现在开发中最常见的错误莫过于Permgen Space!

解决办法:

1,把不必要的 jar 文件清理出 lib;
2,不要频繁地进行 reload;
3,增加 PermGen Space 内存区域,默认是 64MB,可以采用 -XX:MaxPermSize 这个 JVM 参数改这块区域改大一些,这个参数详见:
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

如果用的是 Tomcat 的话,可以在 catalina.bat 开始处增加一行 set JAVA_OPTS=-XX:MaxPermSize=128m

垃圾回收算法

复制算法(copying)
将内存分成两块,每次只使用其中一块,垃圾回收时,将标记的对象拷贝到另外一块中,然后完全清除原来使用的那块内存。复制后的空间是连续的。复制算法适用于新生代,因为垃圾对象多于存活对象,复制算法更高效。在新生代串行垃圾回收算法中,将eden中标记存活的对象拷贝未使用的s1中,s0中的年轻对象也进入s1,如果s1空间已满,则进入老年代;这样交替使用s0和s1。这种改进的复制算法,既保证了空间的连续性,有避免了大量的内存空间浪费。

标记-压缩算法(Mark-compact)
适合用于老年代的算法(存活对象多于垃圾对象)。
标记后不复制,而是将存活对象压缩到内存的一端,然后清理边界外的所有对象。

注意:

1.增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作

JVM参数:

-XX:+PrintGCDetails  打印垃圾回收信息

-Xms 为Heap区域的初始值,线上环境需要与-Xmx设置为一致,否则capacity的值会来回飘动
-Xmx 为Heap区域的最大值
-Xss(或-ss) 线程栈大小(指一个线程的native空间)1.5以后是1M的默认大小
-XX:PermSize与-XX:MaxPermSize  方法区(永久代)的初始大小和最大值(但不是本地方法区)
-XX:NewRatio  老年代与新生代比率
-XX:SurvivorRatio  Eden与Survivor的占用比例。例如8表示,一个survivor区占用 1/8 的Eden内存,即1/10的新生代内存,为什么不是1/9?因为我们的新生代有2个survivor,即S1和S22。所以survivor总共是占用新生代内存的 2/10,Eden与新生代的占比则为 8/10。
-XX:MaxHeapFreeRatio  GC后,如果发现空闲堆内存占到整个预估的比例小于这个值,则减小堆空间。
-XX:MinHeapFreeRatio  GC后,如果发现空闲堆内存占到整个预估的比例大于这个值,则增大堆空间。
-XX:NewSize    新生代大小

Jstat用法

http://my.oschina.net/skyline520/blog/304805

打出进程堆栈信息
jmap -dump:format=b,file=2.dump pid

查看java运行系统内部信息

先用top -H -p pid 找到进程下cpu最高的线程 比如是4571 (16进账是11DB)
然后用jstack pid > jstack.log
然后在log文件中查看11DB的信息

本文转载整理至:

http://blog.csdn.net/kingofworld/article/details/17718587

http://www.cnblogs.com/dingyingsi/p/3760447.html

http://blog.csdn.net/ji13921602232/article/details/51159142

http://blog.csdn.net/doc_sgl/article/details/46594975

http://my.oschina.net/skyline520/blog/304805

转载于:https://www.cnblogs.com/jager/p/5679902.html

JVM内存结构与GC相关推荐

  1. 浅谈 JVM 内存结构及 GC 机制

    前言 JAVA GC(Garbage Collection,垃圾回收)机制是区别C++的一个重要特征,C++需要开发者自己实现垃圾回收的逻辑,而JAVA开发者则只需要专注于业务开发,因为垃圾回收这件繁 ...

  2. Jvm 系列(二):Jvm 内存结构

    所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问 ...

  3. jvm系列(二):JVM内存结构

    所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问 ...

  4. jvm内存结构_浅谈JVM内存结构

    JVM 可以分为 5 个部分,分别是: 类加载器(Class Loader):加载字节码文件到内存. 运行时数据区(Runtime Data Area):JVM 核心内存空间结构模型. 执行引擎(Ex ...

  5. arraylist线程安全吗_Java的线程安全、单例模式、JVM内存结构等知识梳理

    java技术总结 知其然,不知其所以然 !在技术的海洋里,遨游! 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 本篇以一些问题开头,请先不看答案,自己思考一下,看一下你 ...

  6. jvm内存结构_JVM系列之内存结构

    JVM的内存结构大概分为: 堆(Heap):线程共享.所有的对象实例以及数组都要在堆上分配.回收器主要管理的对象. 堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden ...

  7. jvm内存结构_聊聊JVM内存结构

    起因 我们经常会在面试的时候被问到JVM的内存结构,很多人会觉得这东西真的有用吗?也就是面试造火箭,入职拧螺丝.问这个就是纯粹来刁难人的吧. 但实际上,我们细想一下. •假设你不知道局部变量实际上属于 ...

  8. JVM内存结构和垃圾回收机制

    目录 JVM内存结构 JVM内存分配机制 对象回收判断机制 引用计数法 可达性分析算法 垃圾回收算法 标记-复制 标记-清除 标记-整理 垃圾回收器 serial(-XX:+UseSerialGC - ...

  9. 学习笔记:Java虚拟机——JVM内存结构、垃圾回收、类加载与字节码技术

    学习视频来源:https://www.bilibili.com/video/BV1yE411Z7AP Java类加载机制与ClassLoader详解推荐文章:https://yichun.blog.c ...

最新文章

  1. 理解并取证:DHCP的工作原理、怎么检测IP地址冲突
  2. 【拓扑排序】【堆】CH Round #57 - Story of the OI Class 查错
  3. CSS Specificity--CSS特性、权重、优先级---CSS specificity规则、
  4. AtCoder Regular Contest 082
  5. 【渝粤教育】国家开放大学2018年春季 0043-22T计算机文化 参考试题
  6. 以实例让你真正明白mapreduce---填空式、分布(分割)编程
  7. 三十四 Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解
  8. LeetCode 1848. 到目标元素的最小距离
  9. 重磅 | 第八届世界华人数学家大会将在清华大学举行
  10. linux Postfix + dovecot + extmail + extman + mysql
  11. mustache.js html模板,js模板引擎Mustache将h5模板页面转化为小程序页面
  12. 如果不当程序员,我可以生活的更好么?
  13. 饭饭的Selenium+xlwt笔记
  14. 发布地图服务时导入已有的tpk切片包作为缓存
  15. Google地图删除marker标点
  16. BLE(11)—— 细说 Initiating
  17. skyline R34与R35分类器---第一次尝试
  18. DSO(1)——DSO论文详细解读
  19. 简单的python毕设选题推荐
  20. 设计模式之策略模式(Strategy Pattern)

热门文章

  1. bizmsg是什么文件可以删除吗_C盘里的文件夹都是什么?可以删除吗?哪些可以删除?...
  2. 使用vant时 tab栏中出现 van-tabs怎么省略号怎么解决
  3. Js Array数组ES5/ES6常用方法
  4. 对于出差的看法_我对于挑选背包的一些小建议
  5. 企业付款到零钱 java_微信支付商户如何开通企业付款到零钱?
  6. C语言实验——打印数字图形(JAVA)
  7. CNN应用之SPP(基于空间金字塔池化的卷积神经网络物体检测)-ECCV 2014-未完待续
  8. 《漫画算法》源码整理-7
  9. JVM 的 工作原理,层次结构 以及 GC工作原理
  10. 一道面试题引发的对JavaScript类型转换的思考