linux 虚拟机什么时候会触发gc
当和同事探讨到一个问题
虚拟机是什么时候会触发GC?是不是只有内存不存的情况下,才会发生GC,还是说,不仅仅是在内存不足的情况下,会发生GC,在内存空间充足的情况下,也会发生GC
(以上的MinorGc,也称之为YGC)这种说法应该是不正确的 20201103改
新创建的对象,是在堆内存上分配空间的,
对象优先在Eden分配
(1)将新生代内存分为一块较大的Eden空间和两块较小的Survivor空间;
(2)每次使用Eden和其中一块Survivor;
(3)当回收时,将Eden和使用中的Survivor中还存活的对象一次性复制到另外一块Survivor;
(4)而后清理掉Eden和使用过的Survivor空间;
(5)后面就使用Eden和复制到的那一块Survivor空间,重复步骤3;
默认Eden:Survivor=8:1,即每次可以使用90%的空间,只有一块Survivor的空间被浪费;
大多数情况下,对象在新生代Eden区中分配;
当Eden区没有足够空间进行分配时,JVM将发起一次Minor GC(新生代GC);
Minor GC时,如果发现存活的对象无法全部放入Survivor空间,只好通过分配担保机制提前转移到老年代。
如何查看系统什么时候触发了GC?
我们在linux上进行测试
linux 上查看gc的命令
借鉴这位优秀的博主
jstat -gcutil 6586
其中的含义:
S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
P:持久代使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
可以看到,
(1)当 Eden 空间快满的情况下,触发了一次 YGC,此时将 Eden和使用中的S1中还存活的对象一次性复制到另外一块S0,而后清理掉 Eden和使用过的 S1 空间
(2)老年代(O)没有变化,但是P增加了,说明发生过一次YGC,导致了一些大的对象直接进入了持久代
从这个角度来说,这个是不是说明了当年轻代(E)空间不足的情况下,触发了一次GC,当空间充足的情况下,不会发生GC,我觉得不是这样的,因为YGC这个统计的就是年轻代发生GC的次数,而不能说明即使空间不满的情况下,没有触发GC