【Java】对象的内存分配 - 垃圾回收过程

Posted by 西维蜀黍 on 2019-03-26, Last Modified on 2021-09-21

对象的内存分配 - 垃圾回收过程

1 对象分配到新生代区域中

所有new出来的对象都会最先分配到新生代区域中,两个survivor区域初始化是为空的。

2 触发 Minor GC

当eden区域满了之后,就引发一次 minor garbage collection(Minor GC)。

3 移动到 S0 Survivor Space

当在进行minor garbage collection(Minor GC)后,存活下来的对象就会被移动到S0 survivor space。

4 再次触发 Minor GC

当eden区域又填满的时候,又会发生下一次的Minor GC,存活的对象会被移动到survivor区域,而未存活对象会被直接删除。

但是,不同的是,在这次的垃圾回收中,存活对象和之前的survivor中的对象都会被移动到S1 survivor space中。

一旦所有对象都被移动到s1中,那么s0和Eden中的对象就会被清除。

仔细观察图中的对象,数字表示经历的垃圾收集的次数。目前我们已经有不同的年龄对象了。

5 循环触发 Minor GC

当eden区域又填满的时候,就会再次触发 Minor GC,从而重复步骤4中的操作,以清除需要回收的对象,并且又切换一次survivor区域,所有存活的对象都被移动至S0。Eden和S1区域中的对象被清除。

6 移动到老年代

重复以上步骤,并一直记录对象的年龄。

当有对象的年龄到达一定的阈值的时候,就将新生代中的对象移动到老年代中。在本例中,这个阈值为8。

7 重复以上

接下来垃圾收集器就会不断重复以上步骤,不断的进行对象的清除和年代的移动。

我们观察上述过程可以发现,大部分的垃圾收集过程都是在新生代进行的,直到老年代中的内存不够用了才会发起一次 major GC,会进行标记和整理压缩。

Reference