JVM 中涉及的 GC 算法对比
一、前言
最近后台工作的活有点少,闲来回顾了 JVM 的东西,依旧挺有趣的,小结分享。
二、算法
图解 + 按点小结
1. 引用计数
- 原理
- 原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数
- 垃圾回收时,只用收集计数为 0 的对象。
- 缺点:
- 引用和去引用伴随加法和减法,影响性能
- 很难处理循环引用
- 其他应用
- Python
2. 标记 - 清除
- 原理
此算法执行分两阶段。
- 标记阶段:标记所有从根节点开始的可达对象
- 清除阶段:清除所有未被标记的对象
- 缺点
此算法需要暂停整个应用,同时,会产生内存碎片
3. 标记 - 压缩
- 原理
- 从根节点开始,对所有可达对象做一次标记。
- 将所有的存活对象压缩到内存的一端。之后,清理边界外所有的空间。
- 优势
- 能够整理内存碎片,避免分配大对象时,空间不够导致 FullGC
- 避免了“复制”算法的空间浪费问题
- 缺点
- 移动对象成本
- 应用
- 适合用于存活对象较多的场合,如老年代
4. 复制算法
- 原理
- 此算法把内存空间划为两个相等的区域,每次只使用其中一个区域
- 垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中
- 优点
- 没有标记、清除的过程,效率高
- 没有内存碎片
- 缺点
- 空间浪费
- 应用
- 不适用于存活对象较多的场合,如老年代