Concurrent Mark and Sweep(并发标记-清除)
CMS的官方名称为 “Mostly Concurrent Mark and Sweep Garbage Collector”(主要并发-标记-清除-垃圾收集器). 其对年轻代采用并行 STW方式的 [mark-copy (标记-复制)算法], 对老年代主要使用并发 [mark-sweep (标记-清除)算法]
CMS的设计目标是避免在老年代垃圾收集时出现长时间的卡顿。主要通过两种手段来达成此目标。
- 第一, 不对老年代进行整理, 而是使用空闲列表(free-lists)来管理内存空间的回收。
- 第二, 在 mark-and-sweep (标记-清除) 阶段的大部分工作和应用线程一起并发执行。
也就是说, 在这些阶段并没有明显的应用线程暂停。但值得注意的是, 它仍然和应用线程争抢CPU时间。默认情况下, CMS 使用的并发线程数等于CPU内核数的 1/4
。
通过以下选项来指定CMS垃圾收集器:
java -XX:+UseConcMarkSweepGC com.mypackages.MyExecutableClass
复制代码
如果服务器是多核CPU,并且主要调优目标是降低延迟, 那么使用CMS是个很明智的选择. 减少每一次GC停顿的时间,会直接影响到终端用户对系统的体验, 用户会认为系统非常灵敏。 因为多数时候都有部分CPU资源被GC消耗, 所以在CPU资源受限的情况下,CMS会比并行GC的吞吐量差一些。
和前面的GC算法一样, 我们先来看看CMS算法在实际应用中的GC日志, 其中包括一次 minor GC, 以及一次 major GC 停顿:
****-05-26T16:23:07.219-0200:``64.322:``[GC``(Allocation``Failure)``64.322:
[ParNew:``613404K->68068K(613440K),``0.1020465``secs]
10885349K->10880154K(12514816K),``0.1021309``secs]
[Times:``user=0.78``sys=0.01,``real=0.11``secs]
****-05-26T16:23:07.321-0200:``64.425:``[GC``(CMS``Initial``Mark)
[1``CMS-initial-mark:``10812086K(11901376K)]
10887844K(12514816K),``0.0001997``secs]
[Times:``user=0.00``sys=0.00,``real=0.00``secs]
****-05-26T16:23:07.321-0200:``64.425:``[CMS-concurrent-mark-start]
****-05-26T16:23:07.357-0200:``64.460:``[CMS-concurrent-mark:``0.035/0.035``secs]
[Times:``user=0.07``sys=0.00,``real=0.03``secs]
****-05-26T16:23:07.357-0200:``64.460:``[CMS-concurrent-preclean-start]
****-05-26T16:23:07.373-0200:``64.476:``[CMS-concurrent-preclean:``0.016/0.016``secs]
[Times:``user=0.02``sys=0.00,``real=0.02``secs]
****-05-26T16:23:07.373-0200:``64.476:``[CMS-concurrent-abortable-preclean-start]
****-05-26T16:23:08.446-0200:``65.550:``[CMS-concurrent-abortable-preclean:``0.167/1.074``secs]
[Times:``user=0.20``sys=0.00,``real=1.07``secs]
****-05-26T16:23:08.447-0200:``65.550:``[GC``(CMS``Final``Remark)
[YG occupancy:``387920``K``(613440``K)]
65.550:``[Rescan``(parallel)``,``0.0085125``secs]
65.559:``[weak refs processing,``0.0000243``secs]
65.559:``[class``unloading,``0.0013120``secs]
65.560:``[scrub symbol table,``0.0008345``secs]
65.561:``[scrub``string``table,``0.0001759``secs]
[1``CMS-remark:``10812086K(11901376K)]
11200006K(12514816K),``0.0110730``secs]
[Times:``user=0.06``sys=0.00,``real=0.01``secs]