2016-02-13 20 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

相關問題