上篇说到,判断哪些对象是需要被回收的,本篇讨论几种垃圾收集算法的思想(包括标记-清除算法,复制算法,标记-整理算法)
1.标记-清除算法
标记-清除算法(Mark-sweep算法)主要包括标记和清除两个阶段,首先标记中需要回收的对象。在标记完成后统一回收被标记的对象如图。
标记-清除算法有两个主要问题:
- 效率问题,标记和清除两个过程的效率不高
- 空间问题,标记清楚之后会产生大量的碎片,导致之后无法分配较大对象
2.复制算法
将内存分为两块(Eden和Survivor),每次只使用其中的一块,当这块内容用完了,就将还存活的对象复制到另一块上面,然后再把使用过的内存空间一次性清理掉,如下图。
并不需要按照1:1的比例来划分,HotSpot虚拟机中Eden和Survivor默认比例为8:1.当Survivor空间不够用的时候,就需要以来其他内存(老年代)进行分配担保。
3.标记-整理算法
标记过程与“标记-清除”一样,后续步骤是让所有存活内存向一端移动。
4.分代收集算法
根据存活周期不同将内存划分为几块,一般分为新生代和老年代。根据各个年代的特点采用适当的收集算法。在新生代中每次有大量对象死去,所以采用复制算法。在老年代中因为对象存活率高,没有额外的担保,就采用“标记-清理”或者“标记-整理版”。