垃圾回收过程

如何回收:

1、标记。扫描所有堆中的对象,并标记需要回收的对象所在的内存;

2、清除上一步标记的需要回收的对象区域,此时会产生碎片问题,标记清除后会产生大量不连续的内存碎片;

     2.1、因此出现压缩清除的方法。先清除需要回收的对象,然后再对内存进行压缩,将内存分成可用和不可用两大部分。


上述回收效率低,回收时间长,有人分析出来,一个程序中大部分的对象都是短命的,因此,为了提高回收效率,JVM将堆进行分代,一般分为新生代、老年代、永久代



分代垃圾收集过程详述

1、所有new出来的对象都会最先分配到新生代区域中,两个survivor(S0和S1)区域初始化是为空的


2、当伊甸园区域满了之后,就会引发一次minor garbage collection(小型垃圾回收);


3、当在minor garbage collection(小型垃圾回收),存活下来的对象就会被移到S0区域;


4、当伊甸园区域再次填满时,又会发生下一次垃圾回收,存活下来的对象会被移到survivor区域,而未存活的对象则被直接删除,但是,不同的是,在这次垃圾回收中,存活对象和之前在S0区域中的对象都会移到S1区域中。一旦所有对象都被移到S1区域中,那么S0中的对象就会被清除;


5、下一次的垃圾回收的时候,又会重复上次的步骤,清除需要回收的对象,并且切换一次survivor区域,所有存活的对象都被移到S0,伊甸园区域和S1区域被清除;


6、重复以上步骤,并记录对象的年龄(记录垃圾回收的次数),当有对象的年龄达到一定的阈值时,就将新生代中的对象移到到老年代。比如下图,这个阈值为8;


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


8、观察上述步骤发现,大部分的垃圾回收过程都是在新生代进行的,直到老年代的内存不够用了才会发起一次minor GC ,会进行标记和整理压缩。


猜你喜欢

转载自blog.csdn.net/chineseyoung/article/details/80488977