《深入理解 Java 虚拟机》- 笔记 - 垃圾收集算法

时间:2023-01-02 09:23:24

标记 - 清除算法


算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。

不足:

  • 标记和清除两个过程的效率都不高。

  • 标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后再程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

复制算法


将可用内存按容量划分大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉。

  • 优点:不用考虑内存碎片问题,只要移动堆顶的指针,按顺序分配内存即可,实现简单,运行高效。

  • 缺点:内存缩小为原来的一半。

标记 - 整理算法


过程与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉边界以外的内存。

分代收集算法


根据对象存活周期的不同将内存划分为几块,一般把 Java 堆分为新生代和老年代,根据各个年代的特点采用最适当的收集算法。