4.ParNew和CMS的工作原理

JVM系列

1.JVM运行机制的整体脉络
2.JVM的分代模型及对象流动
3.常见的垃圾回收器及算法
4.ParNew和CMS的工作原理

1.ParNew的运行原理及参数设置
  • 停止工作线程,停止创建对象,使用复制算法多线程回收,默认线程数等于cpu数量。运行图如下:
image.png

*指定使用ParNew -XX:+UseParNewGC, 可以通过-XX:ParallelGCThreads来设置线程数量。

2.CMS运行原理,产生问题及参数设置
  • CMS执行一次回收分为4个阶段:
    1.初始标记
    会Stop The World停止工作线程,标记GC Roots(局部变量和类的静态变量)引用的对象。速度很快,因为只标识GC Root引用的对象。  
    2.并发标记
    并发进行,系统一边工作,一边进行垃圾回收,对系统的所有对象进行GC Root追踪,看有没有最终被GC Root的对象引用,这个过程很耗时。但是不影响系统的工作,系统工作期间会继续有对象进入老年代,这些对象有可能变成垃圾或被引用,在下一个阶段进行处理。
    3.重新标记
    会Stop The World,这时对上个阶段产生的垃圾或者存活的对象再作一次标记,这个阶段速度也很快。
    4.并发清理
    这个阶段很耗时,和系统并发运行,不影响系统工作。清理掉被标记的垃圾对象,并进行对象移动整理,减少内存碎片。

  • CMS默认回收线程数
    线程数=(CPU个数 + 3)/4 比如4核的就会有一个回收线程。

  • CMS垃圾回收带来的问题
    1.GC的时候会产生CPU资源紧张的问题。
    2.在第二阶段并发标记,系统是一直工作的,会产生浮动垃圾。如果此时新生代或者大对象的创建,要往老年代里面放对象,此时刚好内存不够,会产生concurrent mode failure。那么这时会自动进行Serial Old回收,单线程,Stop The World对所有对象进行扫描清理。非常影响性能。
    3.内存碎片问题。

  • 参数设置
    1.使用CMS回收器,-XX:+UseConcMarkSweepGC
    2.设置老年代内存占用比例,达到就进行垃圾回收。-XX:CMSInitiatingOccupancyFraction=92%,默认92%
    3.设置几个Full GC后进行碎片整理,-XX:+UseCMSCompactAtFullCollection=0,默认是0,代表每次Full GC 后都会进行碎片整理,此时会Stop The World。

你可能感兴趣的:(4.ParNew和CMS的工作原理)