2010-05-11 57 views
7

我的應用程序顯示上升的'老一代'/'老化世代'的大小,當它達到'老一代'的最大限制時,突然PermGen大小增加。 下面是我這一代的浸潤劑:Java HotSpot 1.6虛擬機,垃圾收集 - 可怕PermGen

-Xmx1200m -Xms1200m -Xmn450m -XX:MaxPermSize=600m -XX:+UseParallelGC 

這是在32位的Fedora所以不能有比這更大的堆。

該應用程序沒有做任何花哨的類加載,雖然它使用Spring IOC和Hibernate,但Spring App-context.xml定義了一些1000 Bean。

這個應用程序開始於175MB PermGen,在幾小時內穩定增加到〜250MB,保持這種狀態直到Tenured Generation達到〜780 MB,然後pergen跳到〜500MB,而Old Gen降到〜500MB。

這迫使我每天重新啓動應用程序,並給我真正的迫近OutOfMemory錯誤的恐慌..任何見解都會非常有幫助。

感謝 Gala101

13 /月:可能有人請扔在當「老根」進行垃圾回收時會發生什麼光?
jvm是否將來自'Old Gen'的集合放入PermGen中?
我的PermGen spike只有在收集來自'Old Gen'時纔會出現,OldGene的大小也隨着PermGen大小的增加而降低。
PS:我不做任何實時部署/取消部署,因爲這肯定會讓PermGen吃光。
下面是我的監視頁面電流spanshot:(已提交的部分剛剛跳下〜250 MB到500 MB)

PS Perm Gen 
Type Non-heap memory 
Usage init = 16777216(16384K) used = 254453736(248489K) committed = 504954880(493120K) max = 629145600(614400K) 
Peak Usage init = 16777216(16384K) used = 254453736(248489K) committed = 504954880(493120K) max = 629145600(614400K) 
Collection Usage init = 16777216(16384K) used = 252421536(246505K) committed = 504954880(493120K) max = 629145600(614400K) 
+0

據我所知MaxPermSize參數不能超過256MB更多... – 2010-05-11 10:12:42

+1

@Bozhidar:不是真的,PermGen的大小可以比 – skaffman 2010-05-11 10:13:24

回答

2

我會按照leonm的建議來分析需要這麼多內存的東西。我敢打賭你有一些討厭的內存泄漏。

你說你沒有做任何花哨的類加載,但Hibernate會爲你自動生成一些類。 您是否使用了一些AOP功能(例如,來自Spring AOP模塊?)。

基本上,如果你的PermGen空間用完了,那麼它看起來像你的應用程序不斷產生新的類(因爲它是存儲在PermGen中的類)。

+0

大得多我會嘗試今晚JMAP和更新.. 我們並沒有使用Spring AOP,而是使用了Spring beans(它們應該是單身人士,不知道這些是否是一個促成因素).. 此外,您或者某人能否點亮「老一代」是垃圾收集? jvm是否將來自'Old Gen'的藏品放入PermGen? 我的PermGen spike僅在收集發生在'Old Gen'時纔會出現,同時OldGen大小的減少與PermGen大小的增加緊密匹配。 – Gala101 2010-05-13 11:27:57

0

使用JMAP您重新啓動服務器,並與Eclipse MAT分析之前做內存轉儲

0

如果您繼續在應用程序服務器上部署/取消部署應用程序,Permgen會泄露。

檢查此鏈接的一些更多解釋如何這不是應用服務器的錯。

http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java

+0

我從不重新部署正在運行的Tomcat,對不起,先前沒有提到 – Gala101 2010-05-13 11:46:04

+0

PermGen大多有類定義。我想知道你有什麼樣的應用程序? – Ram 2010-05-14 05:12:21