jvm gc过程,你清晰吗

jvm为了内存高效回收,堆空间分为不同的区域,年轻代(young generation)、老年代(old generation)。年轻代又分为伊甸园区域(eden space)和两个幸存者区域(survivor space)。

那么,我们来看下,jvm在进行垃圾回收时,这些不同区域是如何交互工作的。 

(以下来自官文的翻译和整理。官文地址Java Garbage Collection Basics

  1. 1. 刚开始时,新创建的对象,首先分配在eden space。两个survivor space区域没有对象,空间为空。

  2. 当eden space满时,发生minor gc

  3. 发生minor gc时,使用mark-swep算法,在eden space中,仍被引用的对象(referenced objects)被移动到其中一个survivor space(S0),剩余的没有被引用的对象(unreferenced objects),也就是不再使用的对象,被清理。

  4. 下一次minor gc时,eden space仍然执行3步骤相同的操作,使用mark-swep算法进行垃圾回收。但是这一次,referenced objects被移动到另外一个survivor space(S1)。而且,上一次minor gc 没有被回收保存在S0的对象,也被移动到S1,同时增长一岁。 如果S1空间,不够保存上一次monitor gc保留下来的所有对象,则溢出的部分直接移动到old generation。 一旦所有的survivor objects移动到S1后,S0 space和eden space都被清空。

  5. 再下一次minor gc时,执行4步骤的相同操作。只是,这一次两个survivor space发生交换。referenced objects被移动到S0,survivor objects都增长一岁。S1 space和eden space被清空

  6. 如下图所示,minor gc之后,如果survivor objects年龄超过阈值(此示例中默认值为8),那么他们从年轻代移动(promotion)到老年代

  7. 随着minor gc不断发生,对象会不断的promotion到老年代。最终,会发生major gc,老年代区域发生垃圾清理和空间压缩

  8. major gc发生时,压缩前和压缩后对比

  9. gc的过程简图

文章来自我的公众号,也欢迎大家关注jvm gc过程,你清晰吗jvm gc过程https://mp.weixin.qq.com/s/7XPldmpytZJJM12btc4mmg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值