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

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

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

(编辑更详细的我目前的情况,希望它会导致答案):

JVM似乎耗尽内存,重复执行次要GC,每次耗时约9秒,最终崩溃.没有抛出OutOfMemoryError,这令我感到困惑.次要GC每次清理几个kB,整体使用率在很长一段时间内徘徊在100%左右.堆大小为4 GB,因此这些条件应触发OutOfMemoryError.但是,我担心这会引发SO问题的非常局部化的情况.

最佳答案 因此,根据
Twitter和一些邮件列表的专家,Java 6更新21中存在一个错误

…CMS won’t always free objects with finalizers[.]

解决方法是禁用设置CMSConcurrentMTEnabled. (或者使用较新版本的Java.)我不确定哪个版本的Java是第一个解决此问题的版本.

点赞