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

TODO 这个未完待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值