JVM 垃圾回收算法
JVM中,总体上分为两种垃圾回收算法
- 标记算法
- 标记-清除算法
- 标记-整理算法
- 复制算法
标记算法
标记-清除算法
工作流程
- 根据GC ROOTS节点进行搜索,标记所有不可触及的对象
- 清理被标记的对象,释放内存
优点
效率高,只处理回收对象,不需要处理未回收的对象
缺点
会产生大量的内存碎片,造成内存浪费,使对象过早进入老年代
标记-整理算法
工作流程
- 根据GC ROOTS节点进行搜索,标记所有不可触及的对象
- 将存活的对象向前移动,更新对象的指针地址
- 将存活边界外的对象进行统一回收
优点
解决了内存碎片的问题
缺点
需要移动存活的对象,会增加句柄数的产生,效率低
复制算法
复制 - 清理算法
工作流程
- 将内存分为S0、S1两块区域,创建对象时只使用1块区域
- 当S0区满时,将存活的对象复制到S1区,并回收S0区,重复上述步骤
优点
- 解决了内存碎片
- 复制和标记可同时进行
- 复制时,只移动栈顶指针即可,后续对象可按顺序分配,简单高效
- 由于只使用了一半内存,所以回收效率上更高
缺点
可用内存减少一半,造成内存浪费
分代回收算法
分代回收算法并不是一个独立算法,他只是上面算法的一个应用方案
- 年轻代使用【复制-清理】算法
- 老年代使用【标记-整理】 / 【标记-清除(CMS)】算法
为什么要分年轻代和老年代
可以根据不同的区域选择不同的垃圾回收算法(分代回收算法)