我有一個JEE應用程序,最近開始發現CPU使用率高峯(例如,40核心服務器上的27個內核的100%)和越來越長的時間段該應用程序不可用。這是非常類似的行爲在下面的帖子中描述的問題,以包括回彈應用程序的服務器,使問題消失,直到它再次出現在幾個小時後的事實:JVM YoungGen 0%,Perm Gen 99%,OldGen Full
Old Gen heap is full and the Eden and Survivor are low and almost empty
我已經採取了一些核心轉儲輸出,而應用程序正在經歷這些「凍結」,我看到下面的JVM GC輸出:基於引用柱和上面的輸出
PSYoungGen total 11221504K, used 2435K
eden space 9238528K, 0% used
from space 19829796K, 0% used
to space 1970176K, 0% used
ParOldGen total 39613440K, used 39276477K
object space 39613440K, 99% used
PSPermGen total 254976K, used 115497K
object space 254976K, 45% used
,我想我明白了「凍結」正在由垃圾收集器在ParOldGen空間上運行(徒勞?)驅動。我缺少的部分:
爲什麼PermGen空間保持在45%的使用率。也就是說,ParOldGen中約39GB的內容最終會轉變爲PSPermGen嗎?
幾乎空PSYoungGen空間的意義是什麼?這是否意味着應用程序不會在穩定狀態下創建任何/許多新的對象實例?
支柱上方還介紹了「多予淨空」來ParOldGen的選項,但我不清楚是否意味着增加通過-Xmx總堆大小或者是否有一個明確的JVM GC參數。我看到NewRatio
論點控制了年輕一代相對於老一代的規模。 PSYoungGen實質上是空的這一事實意味着它太大了,我應該使用更小的NewRatio
值?
在此先感謝您的幫助。
從老根的東西沒有得到晉升爲permgn空間,你可能有一個在permgen某處泄漏,你的應用程序是否動態地創建了很多類? –
謝謝你的評論。我現在明白,permgen空間不是堆的一部分(每個http://stackoverflow.com/questions/2129044/java-heap-terminology-young-old-and-permanent-generations )。該應用程序確實創建了很多動態類。看起來我們要麼有內存泄漏,要麼應用程序的內存要求超過當前的-Xmx值。 –
您可以動態創建大量的類或對象嗎?如果類然後你的permgen會充滿,如果對象然後oldgen。 –