垃圾收集

垃圾收集器之间的联系

image-20210117232036265

有连线说明可以搭配使用

年轻代常见的垃圾收集器

Serial收集器(-XX:+UseSerialGC,复制算法)

  • 复制算法
  • 单线程收集,进行垃圾收集时,必须暂停所有工作线程
  • 简单高效,Client模式下默认的年轻代收集器
image-20210117232312834

ParNew收集器(-XX:+UseParNewGC,复制算法)

  • 复制算法
  • 多线程收集,其余的行为、特点和Serial收集器一样
  • 单核执行效率不如Serial,在多核下执行才有优势
image-20210117232458441

Parallel Scavenge收集器(-xx:+UseParallelGC)

  • 复制算法
  • 比起关注用户线程停顿时间,更关注系统吞吐量
    • 吞吐量 = 运行用户代码的时间 / (运行用户代码的时间 + 垃圾收集的时间)
  • 在多核下执行才有优势,Server模式下默认的年轻代收集器
image-20210117232826462

老年代常见的垃圾收集器

Serial Old收集器(-XX:+UseSerialOldGC)

  • 标记-整理算法
  • 单线程收集,进行垃圾收集时,必须暂停所有工作线程
  • 简单高效,Client模式下默认的老年代收集器
image-20210117233027994

Parallel Old收集器(-XX:+UseParallelOldGC)

  • 标记-整理算法
  • 多线程,吞吐量优先
image-20210117233210514

CMS收集器(-XX:+UseConcMarkSweepGC)

  • 标记-清除算法
  • 尽可能缩短了停顿时间
  • 步骤
    • 初始化标记:stop-the-world
    • 并发标记:并发追溯标记,程序不会停顿
    • 并发预清理:查找执行并发标记阶段从年轻代晋升到老年代的对象
    • 重新标记:暂停虚拟机,扫描CMS堆中的剩余对象
    • 并发清理:清理垃圾对象,程序不会停顿
    • 并发重置:重置CMS收集器的数据结构
image-20210117233747857

G1收集器(-XX:+UseG1GC)

Garbage First收集器

  • 复制+标记-整理算法
  • 并行和并发
  • 分代收集
  • 空间整合
  • 可预测的停顿
  • 将整个Java堆内存划分为多个大小相等的Region
  • 年轻代和老年代不再物理隔离
image-20210117234117393