【问题标题】:Does -XX:+CMSIncrementalMode run on application threads or in GC-dedicated threads?-XX:+CMSIncrementalMode 是在应用程序线程还是在 GC 专用线程上运行?
【发布时间】:2019-11-24 23:57:20
【问题描述】:
在阅读此博客中的Really? iCMS? Really? 时,有一句话引起了我的注意:
并发阶段通常很长(想想秒而不是毫秒)。
如果 CMS 占用单个硬件线程几个
秒,应用程序不会在这些期间执行
几秒钟,会在
效果体验停止世界的暂停。
这对我来说在抢占式操作系统上没有意义。我的假设是 CMS 有一个或多个收集器线程正在运行。另一个假设是,不是让 CMS 有专门的 GC 线程来执行垃圾收集,而是让应用程序线程将其逻辑与 GC 逻辑交错(时间多路复用)。
是这样吗?我在这里做错了什么?
谢谢
【问题讨论】:
标签:
garbage-collection
jvm
jvm-hotspot
【解决方案1】:
在 HotSpot JVM 中,垃圾收集器(包括 CMS 和 i-CMS)使用专用的工作线程。
CMS 线程与应用程序线程同时运行,但它们有higher priority:NearMaxPriority。在单核机器上,CMS 循环确实会使应用程序线程饿死。 CMS 增量模式的想法是让 GC 自愿将 CPU 让给应用程序,而不依赖于 OS 调度程序。
来自HotSpot GC Tuning Guide:
通常,CMS 收集器在处理过程中使用一个或多个处理器
整个并发跟踪阶段,没有自愿放弃
他们。同样,一个处理器用于整个并发扫描
阶段,再次不放弃它。这个开销可能太多了
具有响应时间限制的应用程序的中断
否则可能会使用处理核心,尤其是在运行时
在只有一两个处理器的系统上。增量模式解决
这个问题是通过将并发阶段分解为短时间的
活动,计划在小暂停之间发生。
注意 CMS 增量模式 was deprecated 早在 2012 年。