主要讨论集中垃圾收集算法的思想及发展过程。
1、标记-清除法
最基础的收集算法是标记-清除法,算法分为标记和清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,其标记过程在之前已经讲过。之所以说他是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其不足进行改进而得到的。
它的不足有两个:一个是效率问题,标记和清除效率都不高;另一个是空间问题,标记清除后产生大量不连续的内存碎片,但后续程序需要分配较大对象时,因无法找到足够连续内存不得不提前触发另一次垃圾收集动作。执行过程图见《深入理解Java虚拟机》P69。
2、复制算法
该算法将可用内存按照容量分为大小相等的两块,每次只是用其中的一块,但这一块内存用完了,就将还存活着的对象复制到了另一块上面,然后再把使用过的内存空间一次清理掉。这样每次对一半的内存空间进行内存回收,内存分配时也就不需要在考虑内存碎片等情况,解决了效率问题。但这种算法的代价是将内存缩小为原来的一半,未免太高了一点。执行过程图见《深入理解Java虚拟机》P70。