2014-12-11 56 views
0

我們正在做一個應用程序的負載測試,並在一段時間後AppDynamics報告「PS老」在100%紅色。完整的GC每10分鐘運行一次。內存的「當前使用率」在70-90%之間變化,它會像這樣持續幾個小時,並且永遠不會因OOM而失敗。100%的老一代 - 這是一個問題嗎?

我認爲一旦老的發電利用率超過一定的水平,GC就會嘗試釋放/壓縮老的發電面積,如果沒有任何東西被釋放,它會或者因OOM而失敗,並在它之前開始瘋狂的完整GC循環。但是我沒有看到任何這些。該應用程序運行良好,使用率達到100%。

我們使用的是Oracle的Java 7U14(64B,4個CPU核心,10GB RAM)和JVM配置了

-XX:+UseParallelOldGC -Xmx4g 

謝謝!

+0

增加堆的大小,如果你想減少完整的GC頻率 – 2014-12-11 04:29:06

+0

謝謝,但是全面的GC每10分鐘發生一次,所需時間不到一秒,所以這很好... – 2014-12-11 04:33:45

+1

你的年輕一代是怎樣的?如果它幾乎是空的 - 可能是你可以調整堆分佈給更多的老一代 – 2014-12-11 04:35:16

回答

1

這是否是一個問題是否真的取決於您自己決定。

  • 一方面,每10分鐘運行一次的完整GC不是吞吐量的重要問題。

  • 另一方面,完整的GC可能會在那一秒鐘的窗口期間顯着減少響應時間。但這可能並不重要,甚至與您的應用程序無關。

我會擔心的是你的負載測試是否是一個現實的測試。該應用程序似乎需要測試4Gb的堆空間,但它是否也需要在真實世界中使用?我擔心在部署到生產環境時可能會出現內存泄漏。或者負載測試中的負載導致應用程序的內存中緩存達到穩定狀態,因此不會在生產環境中進行復制。

作爲一般規則,堆靠近完整運行是一件壞事,所以增加堆可能是可取的。您的應用程序的性能似乎並未受到影響,但您可能會「處於風口浪尖」。


我認爲,一旦老根利用率高於一定水平時,GC將嘗試免費/緊湊的老根區,如果沒有被釋放,那麼它要麼失敗,OOM,只是之前開始瘋狂完整的GC週期它。

我懷疑監測報告可能會誤導您。如果完整的GC週期是真的不收回任何東西,我希望這種行爲是不同的。

嘗試啓用JVM GC日誌消息,並查看他們告訴您關於完整GC循環管理回收的內存量的信息。