我正在使用 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/