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=0.00,``real=0.01``secs]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: minor gc 和 full gcJava 虚拟机中的两种垃圾回收方式。 minor gc 是指对年轻代进行垃圾回收,年轻代中的对象一般存活时间较短,因此垃圾回收频率较高。minor gc 通常会暂停应用程序的执行,直到垃圾回收完成。 full gc 是指对整个堆进行垃圾回收,包括年轻代和老年代。老年代中的对象一般存活时间较长,因此垃圾回收频率较低。full gc 会暂停应用程序的执行,直到垃圾回收完成,因此会对应用程序的性能产生较大影响。 因此,minor gc 和 full gc 的区别在于垃圾回收的范围和频率,以及对应用程序性能的影响程度。 ### 回答2: Minor GC(Young GC)和Full GC(Major GC)是Java虚拟机(JVM)中垃圾收集的两个重要阶段。 Minor GC主要负责清理年轻代(Young Generation)的垃圾对象,年轻代又分为Eden区、Survivor 0区和Survivor 1区。当Eden区满时,触发Minor GC。在这个过程中,存活的对象会被复制到Survivor区,然后进行垃圾回收。Minor GC是一个短暂的过程,通常不会引起长时间的应用暂停。因为大部分对象在年轻代很快就被回收,所以Minor GC的频率比较高。 Full GC则是对整个堆内存进行垃圾回收。它主要清理老年代(Old Generation)和永久代(Perm Generation)中的垃圾对象。Old Generation存放生命周期较长的对象,而Perm Generation存放类信息、常量等。Full GC的频率较低,一般在触发条件满足时才会发生。Full GC执行时间较长,会导致应用的停顿,并且会造成较大开销。 总结而言,Minor GC主要针对年轻代的回收,频率较高但耗时较短,而Full GC则是对整个堆内存进行垃圾回收,频率较低但耗时较长。Minor GC的目标是快速地回收生命周期短的对象,而Full GC则是为了清理老年代和永久代中的垃圾对象以防止内存不足。了解Minor GC和Full GC的区别有助于我们优化JVM的垃圾回收策略,提高应用的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值