4

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

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

(编辑以获取有关我当前情况的更多详细信息,希望它会导致答案):

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

4

2 回答 2

2

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

...CMS 不会总是使用终结器释放对象[.]

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

于 2016-02-16T23:28:39.783 回答
0

EDIT:

Using a single thread on multi core machine does not use full capabilities of machine.

If you want to increase number of parallel gc threads with CMS, you can use below configuration.

The number of garbage collector threads can be controlled with the command line option -XX:ParallelGCThreads=.

More fine tuning options can be found at documentation article.

Consider using G1GC in place of CMS.

G1GC has become very popular with large heaps post JDK 7 update 4 release. It may become default GC algorithm in Java 9 version.

By setting goals like pause time goal, you can improve predictability of pause time.

Have a look at

http://www.oracle.com/technetwork/articles/java/g1gc-1984535.html

and

http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html

于 2016-02-17T16:44:53.710 回答