1. 标记-清除算法(Mark-Sweep)
工作原理:
-
首先标记出所有需要回收的对象
-
在标记完成后,统一回收掉所有被标记的对象
-
也可以反过来操作:标记存活的对象,然后回收所有未被标记的对象
优点:
-
实现简单直接
缺点:
-
会产生内存空间碎片问题
-
需要"Stop the World"(暂停所有用户线程),类似于"一边扫地一边有人扔垃圾"的情况
-
只能尽可能减少暂停时间,无法完全避免
2. 标记-复制算法(Mark-Copy)
工作原理:
-
将内存分为大小相等的A、B两个区
-
新对象首先分配到A区
-
当A区内存满时,将存活的对象复制到B区
-
清除整个A区
-
之后新对象分配到B区,当B区满时重复上述过程
优点:
-
实现相对简单
-
不会产生内存碎片问题
缺点:
-
收集效率不高或对象存活率高时性能较差
-
只有一半的内存空间是有效的(另一半始终为空闲状态)
-
仅适用于对象存活率低的场景(即大多数对象都是短命的)
3. 标记-整理算法(Mark-Compact)
工作原理:
-
标记阶段与标记-清除算法相同
-
后续不是直接清理可回收对象,而是将所有存活对象向内存空间一端移动
-
然后直接清理掉边界以外的内存
特点:
-
会移动对象,改变对象的内存地址
-
解决了内存碎片问题
-
但对象移动会增加计算开销
总结对比
在实际的垃圾回收器实现中,往往会结合使用这些算法,针对不同代际(新生代/老年代)采用最适合的算法组合。