我的當前應用程序在2GB內存上運行正常的GC週期。如果我增加內存堆,它會增加GC時間
我想將JVM內存增加到4GB以提高應用程序性能。
會增加GC時間嗎?如果是,多少表現會受到影響。他們對調整GC有什麼好看的?
我的當前應用程序在2GB內存上運行正常的GC週期。如果我增加內存堆,它會增加GC時間
我想將JVM內存增加到4GB以提高應用程序性能。
會增加GC時間嗎?如果是,多少表現會受到影響。他們對調整GC有什麼好看的?
簡答
是的,時間會增加。更大的堆=更長的暫停時間
長的答案
,需要考慮幾個因素。你如何配置GC來運行?你有多大的年輕人?你多久看一次完整的GC?
如果你很少看到完整的GC的那麼差可以忽略不計。如果您將GC活動記錄到日誌中,您可以看到部分GC的暫停時間非常快。部分GC上2GB和4GB之間的差異將在0.1s左右。要記錄GC活動,您可以使用以下參數-XX:+PrintGCDetails -verbose:gc -Xloggc:/log/path/gc.log
。有很多工具可以讀取這個GC日誌,提供圖形和統計數據,例如吞吐量和總暫停時間。
如果您看到頻繁的完全GC的,這就是爲什麼要添加更多的內存,那麼你可能要考慮分析應用程序,而不是看到什麼是吃了所有的記憶。隨着更大的堆,這些問題只會導致更長的GC,直到您解決基本問題。
最後,你需要正確地嘗試各種配置,測試並投入生產環境什麼工作最適合你。
有沒有直接的答案,因爲答案取決於你的應用程序記憶明智的。然而,你應該考慮到,如果你增加jvm內存,那麼你的應用程序會有更多的內存......並且如果使用了所有的內存,那麼你的gc將被更頻繁地調用(增加GC時間)
增加內存並不總是最好的解決方案,優化對象的使用和回收未使用的對象可能是更好的解決方案。
-1:更多的可用存儲裝置的(全)GC會越來越頻繁 – 2011-06-07 14:49:34
@邁克爾博格瓦特進行:你誤解了我的答案。在短期內,GC將不那麼頻繁調用,但它依賴於應用程序的工作....如果應用程序有內存泄漏,你將最終獲得了同樣的問題... – VirtualTroll 2011-06-07 14:52:00
有內存泄漏是失敗的情景本身並不涉及性能調優問題。 – 2011-06-07 14:58:41
大堆==長GC停頓。
我已經看到GC停在幾個分鐘〜10G大小的堆。
另一方面,較小的堆意味着更頻繁(但更短)的GC循環。這個問題沒有很好的通用答案 - 這一切都取決於你的應用程序(高頻交易應用程序?小貓網絡服務器?),硬件,對象流失等的需求。
幾個很好的資源來閱讀這個主題:
更多的可用內存,會降低在GC上花費的總時間,但增加一個完整的GC所花費的時間。但是,現代JVM不一定使用「停止世界」垃圾收集器。
調整GC當然取決於你使用的是什麼JVM。 Oracle JVM有一個huge amount of GC tuning options和一個相當廣泛的tuning guide。
如果您想了解通過閱讀http://java.sun.com/performance/reference/whitepapers/tuning.html和http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html
關於你的問題,你如何調整你的JVM啓動有沒有簡單的答案,但增加堆都將延緩完整垃圾回收也將使它持續較長時間。
性能調整是一種黑色藝術,一旦你開始改變你的GC設置,它就變成了你需要不斷監視的東西,因爲在我看來你正在告訴VM你知道得更好。
有一些VM標誌可以添加到日誌GC暫停和堆大小非常有用,你可以grep你的日誌,並獲得一些很好的統計資料。
冗長:GC -XX:+ PrintGCDetails XX:+ PrintGCTimeStamps -Xloggc:PATH_FROM_ROOT/gclog.log
使用JVisualVM,JConsole的或良好的探查等JProfiler的監視。 一個很好的開始閱讀有關GC是
你的意思是在長期或短期總GC時間?這是一個非常重要的細節。 – mindas 2011-06-07 14:40:13
我的意思是短期。不要懷疑GC呼叫將不會減少,但是單個GC循環所花費的時間是多少。 – Kamahire 2011-06-07 14:42:59
僅供參考我希望您使用的是64位操作系統和64位JVM。請注意,如果您使用的是32位操作系統,則通常無法讓JVM使用4GB的容量。然而,關於64位JVM的一個大投訴是GC可能成爲一個問題。 – 2011-06-07 14:43:12