【JVM】第四篇 垃圾收集器ParNew&CMS底层三色标记算法详解

导航

      • 一. 垃圾收集算法详解
        • 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. 记忆集和卡表

一. 垃圾收集算法详解

【JVM】第四篇 垃圾收集器ParNew&CMS底层三色标记算法详解_第1张图片

1. 分代收集算法

  根据对象存活周期的不同将内存分为几块。一般将堆分为新生代和老年代,根据不同年代的特点选择合适的垃圾收集算法。
如在新生代中,每次GC都会有大量的对象(99%)死去,所以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。
如老年代中对象的存活几率是非常高的,而且没有额外的空间进行分配担保,所以选择“标记-清除”或“标记-整理”算法进行垃圾收集。
注意:“标记-清除”或“标记-整理”算法会比复制算法慢10倍以上。

2. 标记-复制算法

  将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。
【JVM】第四篇 垃圾收集器ParNew&CMS底层三色标记算法详解_第2张图片
优缺点: 效率高,但是只能使用在年轻代,不能使用在老年代中,老年代中大多数的对象都是存活的,没有多余的担保空间来将内存一分为二。

3. 标记-清除算法

  算法分为“标记”和“清除”阶段:标记存活的对象,统一回收所有未被标记的对象(一般选择这种);也可以反过来,标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。
【JVM】第四篇 垃圾收集器ParNew&CMS底层三色标记算法详解_第3张图片
优缺点:
效率问题(如果需要标记的对象太多,效率不高)
空间问题(标

你可能感兴趣的:(Java,#,JVM,jvm,java)