CMS垃圾收集器详解

CMS垃圾回收器是Java中常用的并发标记清除算法,以减少应用停顿时间为目标。它包括初始标记、并发标记、预清理、可终止的预处理、重新标记、并发清理和并发重置等多个阶段。CMS并非full GC,而是老年代GC,可能出现内存碎片、concurrent mode failure和promotion failed等问题。为优化CMS,可以关注参数如CMSInitiatingOccupancyFraction和UseCMSCompactAtFullCollection,以及调整线程数。通过理解CMS工作原理和调整参数,可以有效减少应用的停顿时间。
摘要由CSDN通过智能技术生成

CMS垃圾回收器详解

垃圾回收器组合

young Tenured JVM options
Serial SerialOld -XX:+UseSerialGC
Parallel Scavenge SerialOld -XX:+UseParallelGC -XX:-UseParallelOldGC
Parallel Scavenge Parallel Old -XX:+UseParallelGC -XX:+UseParallelOldGC
Parallel New或Serial CMS -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
G1   -XX:+UseG1GC

垃圾回收器从线程运行情况分类有三种

 

CMS

cms是最常用的垃圾垃圾回收器,下面分析下CMS垃圾回收器工作原理;

CMS 处理过程有七个步骤:
1. 初始标记(CMS-initial-mark) ,会导致swt;
2. 并发标记(CMS-concurrent-mark),与用户线程同时运行;
3. 预清理(CMS-concurrent-preclean),与用户线程同时运行;
4. 可被终止的预清理(CMS-concurrent-abortable-preclean) 与用户线程同时运行;
5. 重新标记(CMS-remark) ,会导致swt;
6. 并发清除(CMS-concurrent-sweep),与用户线程同时运行;
7. 并发重置状态等待下次CMS的触发(CMS-concurrent-reset),与用户线程同时运行;
cms运行流程图如下所示:
CMS流程图

下面抓取一下gc信息,来进行详细分析,首先将jvm中加入以下运行参数:

     -XX:+PrintCommandLineFlags                  [0]
     -XX:+UseConcMarkSweepGC                     [1]   
     -XX:+UseCMSInitiatingOccupancyOnly          [2]
     -XX:CMSInitiatingOccupancyFraction=80       [3]
     -XX:+CMSClassUnloadingEnabled               [4]
     -XX:+UseParNewGC                            [5]
     -XX:+CMSParallelRemarkEnabled               [6]
     -XX:+CMSScavengeBeforeRemark                [7]
     -XX:+UseCMSCompactAtFullCollection          [8]
     -XX:CMSFullGCsBeforeCompaction=0            [9]
     -XX:+CMSConcurrentMTEnabled                 [10]
     -XX:ConcGCThreads=4                         [11] 
     -XX:+ExplicitGCInvokesConcurrent            [12]
     -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses    [13]
     -XX:+CMSParallelInitialMarkEnabled          [14]

     -XX:+PrintGCDetails                         [15]
     -XX:+PrintGCCause                           [16]
     -XX:+PrintGCTimeStamps                      [17]
     -XX:+PrintGCDateStamps                      [18]
     -Xloggc:../logs/gc.log                      [19]
     -XX:+HeapDumpOnOutOfMemoryError             [20]
     -XX:HeapDumpPath=../dump                    [21]

 

下面就是该参数设置打印出来的gc信息,一些非关键的信息已经去掉,如时间:

//第一步 初始标记 这一步会停顿
[GC (CMS Initial Mark) [1 CMS-initial-mark: 299570K(307200K)] 323315K(491520K), 0.0026208 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
         vmop                    [threads: total initially_running wait_to_block]    [time: spin block sync cleanup vmop] page_trap_count
0.345: CMS_Initial_Mark                 [      10          0              1    ]      [     0     0     0     0     2    ]  0   
Total time for which application threads were stopped: 0.0028494 seconds

//第二步 并发标记
[CMS-concurrent-mark-start]
[CMS-concurrent-mark: 0.012/0.012 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 

//第三步 预清理
[CMS-concurrent-preclean-start]
[CMS-concurrent-preclean: 0.001/0.001 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

//第四步 可被终止的预清理
[CMS-concurrent-abortable-preclean-start]
[CMS-concurrent-abortable-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

//第五步 重新标记
[GC (CMS Final Remark) [YG occupancy: 72704 K (184320 K)][Rescan (parallel) , 0.0009069 secs][weak refs processing, 0.0000083 secs][class unloading, 0.000262
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值