java - 什么时候有人会在多核机器上使用带有 CMS 垃圾收集器的单线程?

标签 java performance concurrent-mark-sweep

我正在使用 Java 7 JVM 的服务器上运行 Apache Storm 拓扑。我一直在考虑对 JVM 进行一些调整,并注意到它目前正在使用并发标记和清除 (CMS) 垃圾收集器。这是有道理的,因为服务器有 32 个内核,并且当它使用此设置运行多个 JVM 时,它只运行 4 个这样的 JVM,少于 32 个内核。

但是,我注意到我们运行垃圾收集器时设置 CMSConcurrentMTEnabled 关闭。该设置的默认设置是on,这让我想知道为什么有人会选择在其他线程可用时使用单个线程进行并发垃圾收集。假设其他线程可用,在什么情况下使用该设置有意义?

(编辑我目前情况的更多细节,希望能得到答案):

JVM 似乎内存不足,反复执行次要 GC,每次大约需要 9 秒,并最终崩溃。没有抛出 OutOfMemoryError,这让我很困惑。次要 GC 每次清理几 kB,整体使用率在 100% 左右徘徊了很长一段时间。堆大小为 4 GB,因此这些情况应触发 OutOfMemoryError。但是,我担心,对于一个 SO 问题,这是一个非常本地化的情况。

最佳答案

因此,根据 Twitter 上的专家和一些邮件列表,在 Java 6 update 21 中有一个错误

...CMS won't always free objects with finalizers[.]

解决方法是禁用设置 CMSConcurrentMTEnabled。 (或者使用更新版本的 Java。)我不确定哪个版本的 Java 最先解决了这个问题。

关于java - 什么时候有人会在多核机器上使用带有 CMS 垃圾收集器的单线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35384758/

相关文章:

php - php中try-catch的性能

java - 当版本低于 Lollipop 时 INSTALL_FAILED_DEXOPT

java - 用于打印的手动分页符在 Apache POI excel 中不起作用

java - 使用java的Sqoop失败

java - DTO 可以是 spring 管理的 bean 吗?

algorithm - 如何解决数组之间的最高组合总数?

PHP:查询 MySQL 最快的方法是什么?因为 PDO 非常慢

Java GC CMS 收集器时间

performance - 如何记录和绘制 Java 应用程序的对象生命周期?

java - 有没有办法通过 JMX 识别 CMS 并发模式故障?