其他分享
首页 > 其他分享> > ParNew&CMS垃圾收集器

ParNew&CMS垃圾收集器

作者:互联网

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

        Serial(串行)收集器是最基本,历史最悠久的垃圾收集器了.大家看名字就知道这个收集器是一个单线程收集器了.它的 “单线程” 的意义不仅仅意味着它只会使用一条垃圾收集线程去完成垃圾收集工作,更重要的是它再进行垃圾收集工作的时候必须暂停其他所有的工作线程("Stop The World "),直到它收集结束.
        新生代采用标记-复制算法,老年代采用标记-整理算法
        垃圾收集算法参考:常见的垃圾收集算法
在这里插入图片描述
        虚拟机的设计者们当然知道Stop The World会带来不良的用户体验,所以在后续的垃圾收集器设计中停顿时间在不断的缩短 (仍然还有停顿,寻找最优秀的垃圾收集器的过程仍在继续).
优点: 与其他收集器的单线程相比,Serial收集器简单而高效,Serial收集器由于没有线程交互的开销,自然可以获得很高的单线程收集效率.
Serial Old收集器是Serial收集器的老年代版本, 它同样是一个单线程收集器.它主要有两大用途:

Parallel Scavenge收集器(-XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代))

        Parallel收集器其实就是Serial收集器的多线程版本,除了使用多线程进行垃圾收集外,其余行为(控制参数;收集算法;回收策略等等)和Serial收集器类似.默认的收集线程数跟cpu核数相同,当然也可以用(-XX:ParallelGCThreads)指定收集线程数,但是一般不建议修改
        Parallel Scavenge收集器关注的点是吞吐量(高效的利用CPU).CMS等垃圾收集器关注点更多的是STW的时间(提高用户体验).所谓的吞吐量就是CPU中用于运行用户代码的时间与CPU总消耗时间的比值. Parallel Scavenge收集器提供了很多参数供用户找到最合适的停顿时间或最大吞吐量,如果对于收集器运作不太了解的同学,可以选择把内存管理优化交给虚拟机去完成也是一个不错的选择.
        新生代采用标记-复制算法,老年代采用标记-整理算法
在这里插入图片描述
        Parallel Old收集器是Parallel Scavenge收集器的老年代版本. 使用多线程和 “标记-整理” 算法.在注重吞吐量以及CPU资源的场合,都可以优先考虑Parallel Scavenge收集器和Parallel Old收集器 (JDK8默认的新生代和老年代收集器).

ParNew收集器(-XX:+UseParNewGC)

        ParNew收集器其实跟Parallel收集器很类似, 区别主要在于它可以和CMS收集器配合使用
        新生代采用标记-复制算法,老年代采用标记-整理算法
在这里插入图片描述
        它是许多运行在Server模式下的虚拟机的首要选择,除了Serial收集器外,只有它能与CMS收集器(真正意义上的并发收集器)配合工作.

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

        CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器.它非常符合在注重用户体验的应用上使用,他是HotSpotu虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作.
        从名字中的Mark Sweep这两个词可以看出,CMS收集器是一种 "标记-清除"算法实现的,它的运作过程相比前面几种垃圾收集器来说更加复杂一些.整个过程:

CMS的相关核心参数

  1. -XX:+UseConcMarkSweepGC: 启用cms
  2. -XX:ConcGCThreads: 并发的GC线程数
  3. -XX:CMSFullGCsBeforeCompaction: 多少次FullGC之后压缩一次,默认是0,代表每次FullGC都会压缩一次
  4. -XX:+UseCMSCompactAtFullCollection: FullGC之后做压缩整理(减少碎片)
  5. -XX:CMSInitiatingOccupancyFraction: 当老年代使用达到该比例时会触发FullGC(默认92%)
  6. -XX:+UseCMSInitiatingOccupancyOnly: 只是用设定的回收阈值(XX:CMSInitiatingOccupancyFraction设定的值),如果不指定,JVM仅再第一次使用设定值,后续则会自动调整
  7. -XX:+CMSScavengeBeforeRemark: 在CMS GC前启动一次Minor GC,降低CMS GC标记阶段(也会对年轻代一起做标记,如果Minor GC就干掉了很多垃圾对象,标记阶段就会减少一些标记时间)时的开销,一般CMS的GC耗时80%都是在标记阶段
  8. -XX:+CMSParallellnitialMarkEnabled: 在初始标记的时候多线程执行,缩短STW的时间
  9. -XX:+CMSParallelRemarkEnabled: 在重新标记的时候多线程执行,缩短STW的时间

标签:标记,收集器,XX,线程,垃圾,ParNew,GC,CMS
来源: https://blog.csdn.net/qq_43135259/article/details/121518732