我正在使用 Java 7 JVM 的服务器上运行 Apache Storm 拓扑。我一直在考虑对 JVM 进行一些调整,并注意到它当前正在使用并发标记和清除 (CMS) 垃圾收集器。这是有道理的,因为服务器有 32 个内核,并且在使用此设置运行多个 JVM 时,它只运行了 4 个少于 32 个内核的此类 JVM。
但是,我注意到我们在设置CMSConcurrentMTEnabled
关闭的情况下运行垃圾收集器。默认设置是打开的,这让我想知道为什么有人会在其他线程可用时选择使用单个线程进行并发垃圾收集。假设其他线程可用,在什么条件下使用该设置有意义?
(编辑以获取有关我当前情况的更多详细信息,希望它会导致答案):
JVM 似乎内存不足,反复执行次要 GC,每次大约需要 9 秒,最终崩溃。没有OutOfMemoryError
被抛出,这让我感到困惑。次要 GC 每次都会清理几个 kB,并且总体使用量在 100% 左右徘徊了很长一段时间。堆大小为 4 GB,因此这些条件应触发OutOfMemoryError
. 但是,我担心,对于一个 SO 问题,这将进入一个非常本地化的情况。