2011-06-07 81 views
2

我的當前應用程序在2GB內存上運行正常的GC週期。如果我增加內存堆,它會增加GC時間

我想將JVM內存增加到4GB以提高應用程序性能。

會增加GC時間嗎?如果是,多少表現會受到影響。他們對調整GC有什麼好看的?

+0

你的意思是在長期或短期總GC時間?這是一個非常重要的細節。 – mindas 2011-06-07 14:40:13

+0

我的意思是短期。不要懷疑GC呼叫將不會減少,但是單個GC循環所花費的時間是多少。 – Kamahire 2011-06-07 14:42:59

+0

僅供參考我希望您使用的是64位操作系統和64位JVM。請注意,如果您使用的是32位操作系統,則通常無法讓JVM使用4GB的容量。然而,關於64位JVM的一個大投訴是GC可能成爲一個問題。 – 2011-06-07 14:43:12

回答

5

簡答

是的,時間會增加。更大的堆=更長的暫停時間

長的答案

,需要考慮幾個因素。你如何配置GC來運行?你有多大的年輕人?你多久看一次完整的GC?

如果你很少看到完整的GC的那麼差可以忽略不計。如果您將GC活動記錄到日誌中,您可以看到部分GC的暫停時間非常快。部分GC上2GB和4GB之間的差異將在0.1s左右。要記錄GC活動,您可以使用以下參數-XX:+PrintGCDetails -verbose:gc -Xloggc:/log/path/gc.log。有很多工具可以讀取這個GC日誌,提供圖形和統計數據,例如吞吐量和總暫停時間。

如果您看到頻繁的完全GC的,這就是爲什麼要添加更多的內存,那麼你可能要考慮分析應用程序,而不是看到什麼是吃了所有的記憶。隨着更大的堆,這些問題只會導致更長的GC,直到您解決基本問題。

最後,你需要正確地嘗試各種配置,測試並投入生產環境什麼工作最適合你。

1

有沒有直接的答案,因爲答案取決於你的應用程序記憶明智的。然而,你應該考慮到,如果你增加jvm內存,那麼你的應用程序會有更多的內存......並且如果使用了所有的內存,那麼你的gc將被更頻繁地調用(增加GC時間)

增加內存並不總是最好的解決方案,優化對象的使用和回收未使用的對象可能是更好的解決方案。

+0

-1:更多的可用存儲裝置的(全)GC會越來越頻繁 – 2011-06-07 14:49:34

+0

@邁克爾博格瓦特進行:你誤解了我的答案。在短期內,GC將不那麼頻繁調用,但它依賴於應用程序的工作....如果應用程序有內存泄漏,你將最終獲得了同樣的問題... – VirtualTroll 2011-06-07 14:52:00

+0

有內存泄漏是失敗的情景本身並不涉及性能調優問題。 – 2011-06-07 14:58:41

3

大堆==長GC停頓。

我已經看到GC停在幾個分鐘〜10G大小的堆。

另一方面,較小的堆意味着更頻繁(但更短)的GC循環。這個問題沒有很好的通用答案 - 這一切都取決於你的應用程序(高頻交易應用程序?小貓網絡服務器?),硬件,對象流失等的需求。

幾個很好的資源來閱讀這個主題:

1

更多的可用內存,會降低在GC上花費的總時間,但增加一個完整的GC所花費的時間。但是,現代JVM不一定使用「停止世界」垃圾收集器。

調整GC當然取決於你使用的是什麼JVM。 Oracle JVM有一個huge amount of GC tuning options和一個相當廣泛的tuning guide

0

性能調整是一種黑色藝術,一旦你開始改變你的GC設置,它就變成了你需要不斷監視的東西,因爲在我看來你正在告訴VM你知道得更好。

有一些VM標誌可以添加到日誌GC暫停和堆大小非常有用,你可以grep你的日誌,並獲得一些很好的統計資料。

冗長:GC -XX:+ PrintGCDetails XX:+ PrintGCTimeStamps -Xloggc:PATH_FROM_ROOT/gclog.log

使用JVisualVM,JConsole的或良好的探查等JProfiler的監視。 一個很好的開始閱讀有關GC是

Tuning Garbage Collection