GC

来源:互联网 发布:单片机型号怎么看 编辑:程序博客网 时间:2024/06/03 18:30

CMS算法

介绍

用于对年老代的回收,目标是尽量减少应用的暂停时间,减少full gc发生的几率,利用和应用程序线程并发的垃圾回收线程来标记清除年老代。适用于响应时间大于吞吐量优先应用

原理

初始标记(CMS-initial-mark) -> 并发标记(CMS-concurrent-mark) -> 重新标记(CMS-remark) -> 并发清除(CMS-concurrent-sweep) ->并发重设状态等待下次CMS的触发(CMS-concurrent-reset),在1、3阶段暂停应用,整个时间小于200毫秒为优。young generation的回收采用的仍然是并行复制收集器,这个跟Paralle gc算法是一致的

参数

-XX:+UseConcMarkSweepGC启用CMS-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。可以同时并行多个垃圾收集线程,但此时用户线程必须停止。后台系统任务可以使用此 gc。-XX:+UseParNewGC:设置年轻代为多线程收集。可与CMS收集同时使用。在serial基础上实现的多线程收集器。-XX:ParallelCMSThreads=20 CMS线程回收数-XX:ParallelGCThreads= N 年轻代线程回收数,默认是(ncpus <= 8) ? ncpus : 3 + ((ncpus * 5) / 8)-XX:+UseCMSCompactAtFullCollection CMS是不会整理堆碎片的,为了防止堆碎片引起full gc,通过会开启CMS阶段进行合并碎片选项,开启这个选项一定程度上会影响性能,配置适当的CMSFullGCsBeforeCompaction来调整性能-XX:CMSFullGCsBeforeCompaction=1 每次full gc进行碎片的合并,以保证新生代的大对象能分配到老年代-XX:+CMSParallelRemarkEnabled开启并行remark,减少remark暂停时间-XX:+CMSScavengeBeforeRemark强制remark之前开始一次minor gc,减少remark的暂停时间-XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled 避免P区引起的full gc-XX:CMSInitiatingOccupancyFraction=80年老代占比超过xx进行CMS收集,年老代增长较慢可调大该值,设置过高可能导致:Concurrent mode failed(由于CMS回收年老代的速度太慢,导致年老代在CMS完成前就被沾满,引发full gc)。计算公式:(Xmn-S0)/Old<=Old(1-F)-XX:MaxTenuringThreshold 年龄达到一定阈值被移入老年代