判断对象是否可回收的算法有两种:
- Reference Counting GC,引用计数算法
- Tracing GC,可达性分析算法
JVM 各厂商基本都是用的 Tracing GC 实现
大部分垃圾收集器遵从了分代收集(Generational Collection)理论。
针对新生代与老年代回收垃圾内存的特点,提出了 3 种不同的算法:
1、标记-清除算法(Mark-Sweep)
标记需回收对象,统一回收;或标记存活对象,回收未标记对象。
缺点:
- 大量对象需要标记与清除时,效率不高
- 标记、清除产生的大量不连续内存碎片,导致无法分配大对象
2、标记-复制算法(Mark-Copy)
可用内存等分两块,使用其中一块 A,用完将存活的对象复制到另外一块 B,一次性清空 A,然后改分配新对象到 B,如此循环。
缺点:
- 不适合大量对象不可回收的情况,换句话说就是仅适合大量对象可回收,少量对象需复制的区域
- 只能使用内存容量的一半,浪费较多内存空间
3、标记-整理算法(Mark-Compact)
标记存活的对象,统一移到内存区域的一边,清空占用内存边界以外的内存。
缺点:
- 移动大量存活对象并更新引用,需暂停程序运行