2016-02-13 42 views
4

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

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

(编辑对我目前的情况更详细,有希望,这将导致一个答案):

的JVM中似乎正在失去的记忆,反复进行轻微的GC是正在〜9每一秒,并最终崩溃。没有OutOfMemoryError已被抛出,这让我感到困惑。次要的GC每次清理几个kB,总体使用率在一段时间内徘徊在100%左右。堆大小为4 GB,因此这些条件应触发OutOfMemoryError。然而,我担心,这正在进入SO问题的非常局部的情况。

+0

明显的问题:你有哪些促使你在过去的任何性能或内存的问题来改变默认设置JVM? – fge

+0

我正在寻找那个;我不是那个设置原始设置的人。我们目前正在调查内存问题。 – BlackVegetable

+0

你能定义“内存问题”吗?是那些定期触发'OutOfMemoryError'的类型?你有没有一个测试环境可以让你测试你的环境? – fge

回答

2

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

... CMS不会永远免费的对象与终结[。]

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

+0

这很方便,但如果您的链接上引用的bug已经公开,那将会很棒。 – mvarge

+0

@mvarge同意;多么痛苦。 – BlackVegetable

0

编辑:

利用多核计算机上的单个线程不使用机器的全部功能。

如果要增加使用CMS的并行gc线程数,可以使用下面的配置。

垃圾回收器线程的数量可以通过命令行选项-XX:ParallelGCThreads =来控制。

更多微调选项可以在documentation文章中找到。

考虑使用G1GC来代替CMS。

G1GC已成为非常受欢迎的大型堆后JDK 7 Update 4版本。它可能成为Java 9版本中的默认GC算法。

通过设定暂停时间目标等目标,可以提高暂停时间的可预测性。

看一看

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

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

+0

这并不直接回答我的问题,尽管它可能是关于JVM整体调优的良好信息。 – BlackVegetable

相关问题