2016-05-14 23 views
4

我有一個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空間上運行(徒勞?)驅動。我缺少的部分:

  1. 爲什麼PermGen空間保持在45%的使用率。也就是說,ParOldGen中約39GB的內容最終會轉變爲PSPermGen嗎?

  2. 幾乎空PSYoungGen空間的意義是什麼?這是否意味着應用程序不會在穩定狀態下創建任何/許多新的對象實例?

支柱上方還介紹了「多予淨空」來ParOldGen的選項,但我不清楚是否意味着增加通過-Xmx總堆大小或者是否有一個明確的JVM GC參數。我看到NewRatio論點控制了年輕一代相對於老一代的規模。 PSYoungGen實質上是空的這一事實意味着它太大了,我應該使用更小的NewRatio值?

在此先感謝您的幫助。

+0

從老根的東西沒有得到晉升爲permgn空間,你可能有一個在permgen某處泄漏,你的應用程序是否動態地創建了很多類? –

+0

謝謝你的評論。我現在明白,permgen空間不是堆的一部分(每個http://stackoverflow.com/questions/2129044/java-heap-terminology-young-old-and-permanent-generations )。該應用程序確實創建了很多動態類。看起來我們要麼有內存泄漏,要麼應用程序的內存要求超過當前的-Xmx值。 –

+0

您可以動態創建大量的類或對象嗎?如果類然後你的permgen會充滿,如果對象然後oldgen。 –

回答

1

ParOldGen中的〜39GB的東西最終會轉變成PSPermGen嗎?

Java 7中的PermGen(替換爲Java 8中的元空間)用於保存代碼。從堆傳遞給PermGen的唯一的東西是字節碼,所以除非你正在生成或加載類,否則沒有任何東西從一個傳遞到另一個。他們是不同的空間。

幾乎空PSYoungGen空間的意義是什麼?

完整的GC後,年輕的gen是空的。一旦你的老電池開始充滿,完整的GC就很常見了。

這是否意味着應用程序未在穩定狀態下創建任何/許多新對象實例?

它最有可能意味着它最近已經完成了GC-ed。

描述了給ParOldGen「給予更多空間」的選項,但是我不清楚這是否意味着通過-Xmx增加總堆大小,或者是否有明確的JVM GC參數。

增加最大堆可以給你更多的頭部空間,但我會首先檢查

  • 你沒有內存泄漏。
  • 您不能將大部分數據從堆中移出,例如一個數據庫或本機內存。

將在事實PSYoungGen基本上是空意味着它是太大,而且我應該使用一個較小的NewRatio值?

這可能有助於爲老一代提供更多的空間,但它可能會在耗盡內存之前給您多一點時間。

0

爲什麼PermGen空間保持在45%的使用率。也就是說,ParOldGen中約39GB的內容最終會轉變爲PSPermGen嗎?

編號OldGen & PermGenPermGen空格不能共享。 PSPermGen大多包含由PermGen空間中的類加載器加載的類。 ParOldGen包含長壽命對象的堆內存。

在JDK 1.8中,PermGen已經由Metaspace取代。有關更多詳細信息,請參閱此article

請參閱以下SE問題,瞭解更多詳情:

Java heap terminology: young, old and permanent generations?

什麼是幾乎空的PSYoungGen空間的意義是什麼?這是否意味着應用程序不會在穩定狀態下創建任何/許多新的對象實例?

@Peter Lawrey已經正確回答了。全GC後,YoungGen幾乎是空的=>你沒有積累從短暫的對象垃圾在你的應用

上面還張貼內容介紹了「多予淨空」來ParOldGen的選項,但我'不清楚這是否意味着通過-Xmx增加總堆大小,或者是否有明確的JVM GC參數。

您的舊gen已滿意味着您的應用程序正在保留堆中的長壽命對象。

現在,你必須使用分析工具像visualvmMAT

檢查可能的內存泄漏(如果有的話)在您的應用程序。如果你沒有內存泄漏,你可以用-Xmx增加堆大小。

PSYoungGen實質上是空的事實意味着它太大了,我應該使用較小的NewRatio值?

由於您使用的是較大的堆,我建議您使用G1GC算法。如果您使用G1GC算法,請不要自定義默認值,因爲G1GC算法會處理更好的堆管理。

看一看上G1GC開關(Complete List of G1 GC Switches部分),Use Cases文章預言文章及相關SE問題:

Java 7 (JDK 7) garbage collection and documentation on G1