Java——垃圾收集器

目录

1. Serial收集器

2. ParNew收集器

3. Parallel Scavenge收集器

4. Serial Old收集器

5. Parallel Old收集器

6. CMS收集器

7. G1收集器


1. Serial收集器

针对新生代,串行GC

是最基本、历史最优解的垃圾回收器

  • 特点

    • 使用复制算法
    • 单线程 -> 只使用一个CPU或一条线程区完成垃圾收集工作
    • 进行垃圾回收时,必须暂停其他工作线程,直到垃圾回收完毕
  • 场景
    • 虚拟机在Client模式下的默认新生代收集器
  • 优点
    • 与其他单线程收集器相比,专心做垃圾回收,简单高效

2. ParNew收集器

针对新生代,串行GC

是Serial的多线程版本,除了使用多线程收集新生代外,其余与Serial一样。

  • 特点
    • Serial的多线程版本,同Serial
  • 场景
    • 虚拟机在Server模式下的首选新生代收集器(除了Serial收集器,唯一能和CMS收集器配合工作的收集器)
  • 优点
    • 虽然由于存在线程交互的开销,没有Serial收集效果好;但是充分的利用CPU资源,回收效率高于单线程

3. Parallel Scavenge收集器

针对新生代,并行GC

  • 特性

    • 使用两个参数控制吞吐量

      • XX:MaxGCPauseMillis       控制大的垃圾收集停顿时间

      • XX:GCRatio       直接设置吞吐量的大小 

  • 场景

    • 停顿时间短 -> 响应速度快 -> 与用户交互频繁

    • 吞吐量高 -> 高效利用CPU,运算快 -> 后台运算较大,交互少

  • 优点
    • 达到一个可控制的吞吐量
    • 具有自适应调节策略
      • 当设置参数 XX:+UseAdaptiveSizePolicy后,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整一些参数(新生代的大小、3个区域的比例等)来达到最大的吞吐量或者最合适的停顿时间。

4. Serial Old收集器

针对老年代,串行GC

  • 特点
    • 类似于Serial收集器,针对老年代
    • 使用标记-整理算法
  • 场景
    • 主要用于虚拟机的Client模式
    • 在Server模式下,与Parallel Scavenge收集器搭配使用或作为CMS收集器的PlanB(在并发收集发生 Concurrent Mode Failure时使用)

5. Parallel Old收集器

针对老年代,并行GC

  • 特点
    • 类似于Parallel Scavenge收集器,针对老年代
    • 使用标记-整理算法
  • 场景
    • 在注重吞吐量和CPU资源敏感的场合,与Parallel Scavenge搭配使用
  • 优点
    • 与Parallel Scavenge搭配使用时,吞吐量超给力

6. CMS收集器

针对老年代,并发GC

  • 特点
    • 尽可能地缩短垃圾收集时用户线程的停顿时间,提高响应速度,用户体验更好
    • 使用标记-清除算法
  • 工作步骤
    • 初始标记
      • 利用可达性分析算法标记能够直接关联的对象(其他工作线程暂停)
    • 并发标记
      • GC Roots Tracing
    • 重新标记
      • 修正并发标记期间,因用户程序继续运行而产生变动的标记。停顿之间较长,但比并发标记短(其他工作线程暂停)
    • 并发清除
      • 清除对象
  • 由于初始标记和重新标记两个需要其他线程暂停的过程较短,我们可以认为,总体上CMS收集器的内存回收是并发的。
  • 优点
    • 并发收集
    • 停顿时间短(低延时)
  • 缺点
    • 对CPU资源非常敏感,并发会占用一部分线程导致应用程序变慢
    • 采用标记-清除算法,内存碎片化
    • 无法处理浮动垃圾,需要将Serial所谓PlanB
      • 浮动垃圾:并发清理过程中用户线程产生的垃圾,由于在标记过程之后,无法进行回收。

7. G1收集器

全区域,该垃圾回收器在新生代和老年代两个区域同时回收垃圾。

  • 特点
    • 将堆划分为多个区域块,并行进行垃圾回收
    • 整体来看,采用标记-整理算法;局部来看,采用复制算法
  • 工作步骤
    • 新生代
      • 采用复制算法,将Eden和Survivor中的对象复制到新的Survivor中
    • 老年代
      • 初始标记
        • 在G1触发minor gc时,开始老年代的初始标记,利用可达性分析算法标记(其他工作线程暂停)
      • 并发标记
        • 在CMS的基础上,计算每个区域的对象存活率,将Tenured区域中存活率很小的对象回收。
      • 最终标记
        • 采用SATB算法做到CMS中重新标记的工作
      • 筛选回收
        • 在G1触发minor gc时,挑出对象存活率低的区域进行回收
  • 优点
    • 低延时效果好

猜你喜欢

转载自blog.csdn.net/qq_42142477/article/details/88807795