【发布时间】:2020-11-16 09:13:13
【问题描述】:
在 Java Performance The Definitive guide 一书中,吞吐量垃圾收集器和 CMS 垃圾收集器的 CPU 利用率比较如下:
吞吐量收集器将(默认情况下)消耗 100% 的 CPU 在机器运行时可用,因此更准确 此测试期间 CPU 使用率的表示如图所示 5-2。大多数时候,只有应用程序线程在运行, 占用总 CPU 的 25%。当 GC 启动时,100% 的 CPU 消耗。因此,实际的 CPU 使用率类似于锯齿模式 在图中,即使测试期间的平均值报告为 直线虚线的值。
在并发收集器中效果不同,当有 与应用程序同时运行的后台线程 线程。在这种情况下,CPU 图表可能如图 5-3 所示。
应用程序线程使用总 CPU 的 25% 启动。 最终它为 CMS 后台线程创建了足够的垃圾 踢;该线程还消耗整个 CPU,导致 总计高达 50%。当 CMS 线程完成时,CPU 使用率下降到 25%, 等等。请注意,没有 100% 的 CPU 峰值时段,这是一个 一点点简化:会有很短的尖峰 在 CMS 新生代收集期间 CPU 使用率为 100%,但那些 足够短,我们可以在讨论中忽略它们。
我知道吞吐量垃圾收集器在运行时会停止所有应用程序线程,而 CMS 垃圾收集器与其他应用程序线程同时运行,但我不明白为什么当吞吐量收集器启动时它会使用整个 CPU 周期并将 CPU 利用率增加到100% 但是当 CMS 收集器启动时,它会留下 50% 的 CPU 未使用?是否有任何东西阻止 CMS 收集器使用所有可用的 CPU 资源?
【问题讨论】: