JVM GC原理和监控

1、JVM内存空间
JVM内存空间,包含新生代空间(Young)和老年代空间(Old)。新生代空间又被分为2个部分,Eden区域和Survivous区域;Survivous区域分为2个板块,s0(To survivous)和s1(From Survivous);

JVM GC原理和监控

 

 

每个部分的具体作用:
Eden区域:用来存放使用new或者newInstance等方式创建的对象,默认这些对象都是存放在Eden区,除非这个对象太大,或者超出了设定的阈值-XX:PretenureSizeThresold,这样的对象会被直接分配到Old区域。
S0区域:用来存放垃圾minor GC时不能被回收的对象;
S1区域:中转站
老年代空间:用于存放s0区域空间不足无法保存的不能被回收的对象;

2、JVM GC原理
第一次young GC:
在不断创建对象的过程中,当Eden区域被占满,此时会开始做Young GC也叫Minor GC,Young GC过程如下:
1)将Eden区域不能被回收的对象,存储到s0区域;若s0区域被占满了,Eden区域剩下不能被回收的对象存放到old区域;
2)将Eden区域全部清空,此时s0区域也是空的;
3)将s0和s1切换标签,即把之前不能回收的对象转移到s1区域,保证s0区域为置空状态,供第二次young gc使用;

第二次young gc:
1)将Eden区域不能被回收的对象和s1中的对象,存储到s0区域;若s0区域被占满了,Eden区域剩下不能被回收的对象存放到old区域;
2)将Eden区域全部清空,此时s0区域也是空的;
3)将s0和s1切换标签,即把之前不能回收的对象转移到s1区域,保证s0区域为置空状态,供第二次young gc使用;

以此类推,young gc的次数,默认为15次,可通过参数--XX:MaxTenuringThreshold=15 配置,当old区域被占满时,就会触发FULL GC 对整个空间进行清空处理;
在发生FULL GC的时候,意味着JVM会安全的暂停所有正在执行的线程(Stop The World),来回收内存空间,在这个时间内,所有除了回收垃圾的线程外,其他有关JAVA的程序,代码都会静止,反映到系统上,就会出现系统响应大幅度变慢,卡机等状态。

3、jvm gc监控
监控命令:
jstat -gcutil pid号 采样间隔(ms) 采样次数

执行结果:

JVM GC原理和监控

 

 

 S0:S0区域使用比例;

S1:S1区域使用比例
E:Eden区域使用比例
O:Old区域使用比例
P:永久代区域使用比例
YGC:Young GC次数
YGCT:Young GC消耗总时间
FGC:Fu'll GC次数
FGCT:Full GC总时间
GCT:垃圾回收消耗总时间

 

上一篇:JVM中堆的介绍


下一篇:老板让我写个Bug,这可咋整?