2010-09-22 89 views
4

堆內存大小在2gig和~8gig之間大約每分鐘抖動一次(見圖片)。爲什麼我的JVM堆大小從2gigs到8g演出?

相關信息:

  • 高流量的網站
  • 大量的物理內存
  • 紅帽5.5
  • 的Java 1.6.0_07
  • Glassfish的2.2.1(是的,我知道這是老了。不,我們不能升級。是的,我知道用作生產應用服務器是不常見的)。
  • -XX:MaxPermSize參數=192米-XX:+ AggressiveHeap -Xms14336m -Xmx14336m

我有內存優化經驗不多,但似乎MaxPermSize參數不與-Xms和XMX走出低谷。或者這是正常的?

jConsole heap thrashing

+0

詢問放入顯式MaxPermSize和AggressiveHeap的人爲什麼這樣做。從繁忙的服務器中我看不到上述問題。 – 2010-09-22 12:54:56

+0

我不能;他們早已離開公司。 – beerbajay 2010-09-22 13:37:30

回答

13

爲什麼我的JVM堆大小從鞭打2G的8場音樂會?

沒有證據表明系統在正常(有害)意義上顛簸。鋸齒圖案表示正在分配物體(上坡),然後GC正在回收它們。分配率似乎有點高,但有跡象表明GC正在高效運行。事實上,堆大小總是回落到〜2Gb的事實是一個好兆頭,因爲%CPU使用率很低。

我幾乎沒有使用內存調整的經驗,但似乎MaxPermSize與Xms和Xmx不兼容。或者這是正常的?

它看起來很正常。

當然,沒有必要增加permGen的大小。 (PermGen的用於可預期到從未被垃圾收集對象;通常intern'd字符串和正常的應用對象不會在分配或代碼段移動到PermGen的空間。)

可以想像,如果沒有有很多內存,高分配率可能是一個值得關注的問題。但是,您無法通過調整GC參數來解決這個問題。你需要做一些分析,看看創建這麼多對象是什麼,看看是否明智地嘗試降低創建速度。取決於應用程序,嘗試可能不明智。


1 - 事實上,從Java 7的intern'd串住在沒有PermGen的常規堆。

+0

在高流量的網絡服務器環境中,我幾乎會期待這樣的事情。每次頁面加載都會導致分配內存,並且在垃圾回收之前不會取消分配。我認爲沒有理由認爲這不正常。 – 2010-09-22 12:27:15

+1

MaxPermSize控制可用於* permanent *對象的內存量 - 這些對象不太可能被垃圾收集 - 例如類定義。這與正常的垃圾收集操作無關。 – 2010-09-22 12:55:27

+0

@Bill - 完全。 – 2010-09-22 13:37:28

0

很正常。所有的java程序都有這樣的內存模式。