Java GC 详解:Minor GC和Full GC以及CMS理解

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 停顿:

  1. ****-05-26T16:23:07.219-0200:``64.322:``[GC``(Allocation``Failure)``64.322:
  2. [ParNew:``613404K->68068K(613440K),``0.1020465``secs]
  3. 10885349K->10880154K(12514816K),``0.1021309``secs]
  4. [Times:``user=0.78``sys=0.01,``real=0.11``secs]
  5. ****-05-26T16:23:07.321-0200:``64.425:``[GC``(CMS``Initial``Mark)
  6. [1``CMS-initial-mark:``10812086K(11901376K)]
  7. 10887844K(12514816K),``0.0001997``secs]
  8. [Times:``user=0.00``sys=0.00,``real=0.00``secs]
  9. ****-05-26T16:23:07.321-0200:``64.425:``[CMS-concurrent-mark-start]
  10. ****-05-26T16:23:07.357-0200:``64.460:``[CMS-concurrent-mark:``0.035/0.035``secs]
  11. [Times:``user=0.07``sys=0.00,``real=0.03``secs]
  12. ****-05-26T16:23:07.357-0200:``64.460:``[CMS-concurrent-preclean-start]
  13. ****-05-26T16:23:07.373-0200:``64.476:``[CMS-concurrent-preclean:``0.016/0.016``secs]
  14. [Times:``user=0.02``sys=0.00,``real=0.02``secs]
  15. ****-05-26T16:23:07.373-0200:``64.476:``[CMS-concurrent-abortable-preclean-start]
  16. ****-05-26T16:23:08.446-0200:``65.550:``[CMS-concurrent-abortable-preclean:``0.167/1.074``secs]
  17. [Times:``user=0.20``sys=0.00,``real=1.07``secs]
  18. ****-05-26T16:23:08.447-0200:``65.550:``[GC``(CMS``Final``Remark)
  19. [YG occupancy:``387920``K``(613440``K)]
  20. 65.550:``[Rescan``(parallel)``,``0.0085125``secs]
  21. 65.559:``[weak refs processing,``0.0000243``secs]
  22. 65.559:``[class``unloading,``0.0013120``secs]
  23. 65.560:``[scrub symbol table,``0.0008345``secs]
  24. 65.561:``[scrub``string``table,``0.0001759``secs]
  25. [1``CMS-remark:``10812086K(11901376K)]
  26. 11200006K(12514816K),``0.0110730``secs]
  27. [Times:``user=0.06``sys=

你可能感兴趣的:(java,jvm,开发语言)