导航
- 一. 垃圾收集算法详解
- 1. 分代收集算法
- 2. 标记-复制算法
- 3. 标记-清除算法
- 4. 标记-整理算法
- 二. 垃圾收集器详解
- 1. Serial收集器
- 2. Parallel Scavenge收集器
- 3. ParNew收集器
- 4. CMS收集器
- 三. 垃圾收集底层三色标记算法实现原理
- 1. 垃圾收集底层使用三色标记算法的原因?
- 2. 垃圾收集器使用三色标记算法的步骤
- 3. 多标-浮动垃圾
- 4. 漏标-读写屏障
- 四. CMS并发清理阶段会误删新生成的对象吗?
- 五. 从Hotsport源码级别讲透读写屏障彻底理解三色标记
- 1. 写屏障
- 2. 写屏障实现原始快照(SATB)
- 3. 写屏障实现增量更新
- 4. 读屏障
- 5. 记忆集和卡表
一. 垃圾收集算法详解
1. 分代收集算法
根据对象存活周期的不同将内存分为几块。一般将堆分为新生代和老年代,根据不同年代的特点选择合适的垃圾收集算法。
如在新生代中,每次GC都会有大量的对象(99%)死去,所以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。
如老年代中对象的存活几率是非常高的,而且没有额外的空间进行分配担保,所以选择“标记-清除”或“标记-整理”算法进行垃圾收集。
注意:“标记-清除”或“标记-整理”算法会比复制算法慢10倍以上。
2. 标记-复制算法
将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。
优缺点: 效率高,但是只能使用在年轻代,不能使用在老年代中,老年代中大多数的对象都是存活的,没有多余的担保空间来将内存一分为二。
3. 标记-清除算法
算法分为“标记
”和“清除
”阶段:标记存活的对象,统一回收所有未被标记的对象(一般选择这种);也可以反过来,标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。
优缺点:
效率问题(如果需要标记的对象太多,效率不高)
空间问题(标