jvm为了内存高效回收,堆空间分为不同的区域,年轻代(young generation)、老年代(old generation)。年轻代又分为伊甸园区域(eden space)和两个幸存者区域(survivor space)。
那么,我们来看下,jvm在进行垃圾回收时,这些不同区域是如何交互工作的。
(以下来自官文的翻译和整理。官文地址Java Garbage Collection Basics)
- 1. 刚开始时,新创建的对象,首先分配在eden space。两个survivor space区域没有对象,空间为空。
- 当eden space满时,发生minor gc
- 发生minor gc时,使用mark-swep算法,在eden space中,仍被引用的对象(referenced objects)被移动到其中一个survivor space(S0),剩余的没有被引用的对象(unreferenced objects),也就是不再使用的对象,被清理。
- 下一次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都被清空。
- 再下一次minor gc时,执行4步骤的相同操作。只是,这一次两个survivor space发生交换。referenced objects被移动到S0,survivor objects都增长一岁。S1 space和eden space被清空
- 如下图所示,minor gc之后,如果survivor objects年龄超过阈值(此示例中默认值为8),那么他们从年轻代移动(promotion)到老年代
- 随着minor gc不断发生,对象会不断的promotion到老年代。最终,会发生major gc,老年代区域发生垃圾清理和空间压缩
- major gc发生时,压缩前和压缩后对比
- gc的过程简图
文章来自我的公众号,也欢迎大家关注jvm gc过程,你清晰吗jvm gc过程https://mp.weixin.qq.com/s/7XPldmpytZJJM12btc4mmg