1.GC分代回收问题
(1)首先对于分代有个定义,堆空间分成了新生代和老年代。新生代又被分成了伊甸园,幸存区From,幸存区To。
(2)对象创建之后会先存在于伊甸园中。
(2.1)但是如果此时伊甸园的空间不够了,那么这个时候会触发Minor GC,使用的是“标记-复制”的算法。没被回收幸存下来的对象被复制到了幸存区TO中,并且寿命+1。
(2.2)交换幸存区From和幸存区To的指针,此时To区指针就指向空白的区域了,From指针指向了刚才那些活下来的对象存在的区域。
(3)此时继续添加对象,伊甸园又满了,这个时候就触发了第二次的Minor GC。此时要回收的区域除了伊甸园,还要检查From指针指向的区域里面的对象。存活下来的对象被复制到了To分区中,并且寿命+1。
(3.1)交换幸存区From和幸存区To的指针。
(4)继续添加对象,继续回收当幸存区From中的对象中的寿命超过一个阈值(默认15),被对象就会被放到老年代中。
(5)继续添加对象,如果新生代和老年代的空间都不足了。此时会触发Full GC,将新生代和老年代的垃圾全部回收掉。