CMS 并发模式失效(Concurrent mode failure)回退到 serial old 收集器

11 篇文章 0 订阅

我正在分析 GC 暂停问题,我注意到当 CMS 使用并且并发模式失败或手动触发 GC
(通过 System.gc( )) 使用的 STW 收集器似乎不是并行的。
(我知道 ExplicitGCInvokesConcurrent 标志,但它不会解决并发故障)。
我尝试使用 -XX:ParallelGCThreads=… -XX:ParallelCMSThreads=… 但它们似乎没有效果。

我是从下面的 GC 日志行中推断出来的

24.904: [Full GC (System) 24.904: [CMS: 302703K->303056K(2116864K), 1.0847520 secs] 484492K->303056K(2423552K), [CMS Perm : 7528K->7525K(21248K)], 1.0852780 secs] [Times: user=1.04 sys=0.02, real=1.09 secs]
如果它是并行的,“user”将等于 “nThreads” * “real”。
此外,如果我选择 ParallelOld GC,它将正确运行。

我真的不明白为什么CMS的故障转移STW机制不是并行的,不是应该尽快完成工作吗?

您是正确的,并发模式失败会串行执行Full GC。
用于 UseParallelGC/UseParallelOldGC 的 parallel old collector 从未移植到 CMS。由于 UseParallelGC 和 CMS 之间的差异,它的工作量超出了我们的预期。

我认为 G1 的行为也一样(AFAIK G1 的后备收集器是从 CMS 复制的)

是的,G1 的行为相同。 G1 不会将 UseParallelGC 实现用于并行完整收集,但会实现符合 G1 设计的一个。 目前,G1 团队一直专注于实现暂停目标和避免完整收集的更好策略。 最后我听说在并行完整收集之前,至少有一些工作需要完成类卸载(JEP 156)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值