G1是一款面向服务端应用的垃圾收集器,Oracle赋予它的使命是未来可以替换掉JDK 5中发布的CMS(Concurrent Mark Sweep)收集器,与其他GC收集器相比,G1具备如下特点: 并行与并发:G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU来缩短 Stop-The-World 停顿的时间,部分其他收集器原本需要停顿Java线程执行的GC动作,...
GC日志中CMS Final Remark 前言 刚开始接触JVM时,对待GC的日志,是保持"逃避"态度的,线上部署的程序没有达到期望的运行效率,或是预期目标时,往往会把问题的矛头指向内存上。 是不是内存不够? GC日志怎么这么多?占用磁盘高达几个G? 不想看到打印怎么多,甚至暴力的将程序日志屏蔽掉。 我也曾经这样干过,写过的程...
统计期间内(18天)发生CMS GC 69次,其中 abortable preclean阶段平均耗时2.45秒,final remark阶段平均112ms,最大耗时170ms. 优化目标 降低abortable preclean 时间,而且不增加final remark的时间(因为remark是STW的)。 JVM参数调优 第一次调优 先尝试调低abortable preclean阶段的时间,看看效果。 有两个参数可以控制...
可终止的预处理 该阶段主要是为了Final Remark做准备,承担了Final Remark阶段足够多的工作。 特点 那为什么又叫做可中断呢?是因为最终重新标记阶段不是并发的,所有用户线程进入final Remark阶段都要被停止。如果在这之前Minor GC刚刚结束,紧接着又发生Final Remark的话,会造成2次连续的停顿。因此,为了避免类似的连续...
从第一个运行结果图来看,CMS并不是我们想的那么简单,实际步骤有:CMS-initial-mark、CMS-concurrent-mark、CMS-concurrent-preclean、CMS-concurrent-abortable-preclean、CMS Final Remark、CMS-concurrent-sweep、CMS-concurrent-reset,一共7个步骤。1、CMS-initial-mark:标记那些直接被GC root引用或者被年轻代存活...
通常 CMS 会尝试在年轻代尽可能空的情况下执行 Final Remark阶段,以免连续触发多次 STW 事件。阶段 5: Concurrent Sweep (并发清除 )ARM清除是在最终标记结束后进行的。应用线程和GC线程都并发负载。GC线程按区域(Region)进行分批回收。对于标记位为0的对象,意味着不影响,会被清除恢复。明确时会检查对象的年龄,...
对于CMS中的Final Remark阶段比较慢的情况,可以采取在该阶段前进行一次YGC,减少年轻代的剩余待标记对象,或者通过配置参数增加引用的并行处理等措施来优化。此外,分析日志以识别耗时小阶段并进行针对性优化,也是解决慢速问题的有效方法。通过理解CMS的工作原理、操作过程及优化策略,可以更好地应对面试中的...
concurrent-abortable-preclean 阶段目的是减轻 final remark 阶段(会暂停应用线程)的负担,这个阶段同样会对 dirty card 的扫描/清理,和 concurrent-preclean 的区别在于,concurrent-abortable-preclean 会重复地以迭代的方式执行,直到满足退出条件。但是concurrent-preclean 已经处理过 dirty card,为什么 jvm 还需要再执...
由日志 “[GC (CMS Final Remark) 3644477.934: [ParNew: 649871K->649871K(1887488K), 0.0000289 secs]” 可知,第二次 CMS GC 日志中包含一次 Young GC,毫无疑问是因为配置了-XX:+CMSScavengeBeforeRemark 参数导致的。 Young GC 后 eden、from、to 三个 space 的使用量都不是 0 的情况依然存在,只是 ed...
而且把这样可能逼我们migrate到G1了,因为即使一次普通final remark的pause也变成了三分之一,这个我们的...