JVM之垃圾回收器学习(一)

概念

  • 并行收集:多条垃圾收集线程并行工作,用户线程处于等待状态。
  • 并发收集:用户线程与垃圾收集线程同时工作(单cpu的话就是交替执行)。
  • 吞吐量:CPU用于运行用户代码的时间与CPU总消耗时间的比值(吞吐量=运行用户代码时间/(总时间)),例如虚拟机运行100分钟,垃圾回收占用1分钟,那么吞吐量就是99%。

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

  • 优点:简单高效,拥有很高的单线程收集效率
  • 缺点:垃圾回收期间需要暂停所有线程,STW:体验差。
  • 算法:年轻代用复制算法,老年代使用标记整理算法。
    image-20210903093651827
Serial(串行)收集器是最基本的、历史最悠久的垃圾收集器。它的单线程意义不仅仅意味着
它只会使用一条垃圾收集线程去完成垃圾回收工具。更重要的是它在进行垃圾收集工作的时候
必须暂停其它所有的工作线程,直到它收集完成。

Parallel Scavenge收集器(-XX:+UseParallelGC,XX:+UseParallelOldGC)

  • 优点:吞吐量高

  • 缺点:体验差,有STW

  • 算法:新生代采用复制算法,老年代采用标记整理算法
    image-20210903105337950

    parallel其实就是serial收集器的多线程版本,默认收集线程数跟cpu一样,使用标记整理算法,
    JDK8默认使用该收集器,垃圾回收过程会集中回收垃圾,会stw,与cms有很大区别。
    

    ParNew收集器(-XX:+UseParNewGC)

  • 优点:并行垃圾收集,多线程收集垃圾,效率高。可以与CMS收集器配合使用。

  • 缺点:体验差,会STW。如果是单核CPUSerial收集器更佳。

  • 算法:复制算法。
    image-20210903110748268

CMS收集器(-XX:+UseConcMarkSweepGC(old))

  • 优点:STW时间段,体验好。只有初始标记和重新标记会发生stw

  • 算法:标记-清除算法

  • 缺点:由于采用标记-清除算法,可能会导致大量的内存碎片,不过可以通过参数开启内存碎片的合并整理。
    image-20210903112250613

  1. 初始标记:暂停所有的其它线程(STW),并记录下gc roots直接能引用的对象,速度很快。
  2. 并发标记:占80%时间。 并发标记阶段就是从GC Roots的直接关联对象开始遍历整个对象图的过程。这个过程很长但不需要停顿用户线程,可以与垃圾收集线程一起并发运行。因为用户程序继续运行,可能会有可能导致已经标记过的对象状态发生改变。
  3. 重新标记:重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分。
  4. 并发清理:开启用户线程,同时GC线程开始对未标记的区域做清除。
  5. 并发重置:重置本次GC过程种的标记数据。
CMS收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户体验的应用上使用,
它是HotSpot虚拟机第一款真正意义上的并发收集器。它地磁实现了让垃圾收集线程与用户线程(基本
上)同时工作。

image-20210902105725220

Q.E.D.


一个热爱生活的95后精神小伙