JVM-垃圾回收GC(2)

垃圾回收器(Garbage Collectors)

image.png
  • 常见组合:
    1.Serial + Serial Old
    2.ParNew + CMS
    3.Parallel Scavenge + Parallel Old

  • Serial单线程,Parallel多线程

  • G1逻辑分代,物理不分代。Epsilon/ZGC/Shenandoah逻辑、物理不分代

  • 垃圾收集器跟内存大小关系
    1.Serial几十兆
    2.Parallel Scavenge上百兆~几个G
    3.CMS 20G
    4.G1上百G
    5.ZGC 4T~16T(JDK13)

Serial
image.png
Serial Old
image.png
Parallel Scavenge
image.png
Parallel Old
image.png
ParNew
image.png
CMS(Concurrent Mark Sweep)
image.png
过程
  1. 初始标记。只是标记一下GC Roots能直接关联到的老年代对象,速度很快。这一阶段会STW
  2. 并发标记。就是进行GC Roots的Tracing,处理器可以与用户线程一起工作。
  3. 重新标记。为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段也会触发STW,停顿时间会比初始标记阶段稍长,远比并发时间短。
  4. 并发清除,处理器可以与用户线程一起工作。
CMS缺点
  1. 垃圾回收时会占用一部分线程,导致系统变慢,总吞吐量会降低。
  2. 无法处理浮动垃圾,需要预留足够的内存空间给用户线程使用,可以通过 -XX:CMSInitiatingOccupancyFraction 参数控制触发垃圾回收的阈值。
  3. 如果预留的内存无法满足程序需要,就会出现“Concurrent Mode Failure”失败,这时将启动应急预案,启用Serial Old 进行垃圾回收,停顿时间会变长。所以-XX:CMSInitiatingOccupancyFraction 参数的值设置的太高,会导致频繁“Concurrent Mode Failure”失败,性能反而降低。
  4. 标记-清理,容易产生内存碎片。-XX:+UseCMSCompactAtFullColletion 开启碎片整理功能,默认开启,-XX:CMSFullGCsBeforeCompaction,控制多少次不压缩的FullGC之后来一次带压缩的
常见问题
  1. Memory Fragmentation(内存碎片化)
    promotion failed
    解决办法
    -XX:+UseCMSCompactAtFullCollection
    -XX:CMSFullGCBeforeCompaction 默认为0,指经过多少次FGC后才进行压缩

  2. Floating Garbage(浮动垃圾)
    concurrent mode failure
    解决办法
    -XX:CMSInitiatingOccupancyFraction 默认92%,指使用空间92%的时候触发FGC,降低阈值,让它有足够的空间留给浮动垃圾

详解:CMS垃圾回收器

你可能感兴趣的:(JVM-垃圾回收GC(2))