2010-08-11 140 views
2

最近,在使用Netbeans 6.8處理JSF Web應用程序時,我經常收到PermGen:內存不足錯誤。我也注意到,這與代碼的熱插拔無關,正如一些人在論壇上提出的那樣;無論何時重新部署代碼,我通常都會重新啓動本地Web服務器Tomcat 6.0。這曾經在一段時間發生在我身上,但到最近,它一直在不斷髮生。在墜毀之前,我通常不能超過兩分鐘。Netbeans Java調試器出現內存不足錯誤

我對這個問題所做的重要觀察是,它似乎只在運行調試器時發生。如果我經常啓動服務器,它將無限期地運行。只要我在調試模式下運行,就會出現此問題。

我已經嘗試了迄今爲止在Tomcat中增加Java的JAVA_OPT內存設置的所有提示;我試着在netbeans.conf中增加Netbeans的可用內存。仍然沒有運氣。如果您想查看我所做的特定配置更改,我也可以發佈。

我也讀過這可能是Java中的內存泄漏的結果。我試過運行Netbean的分析器,但是在我能做任何真正有用的事情之前,它通常會崩潰。另外,當它運行時,所有具有荒謬世代的對象分配都是java庫中的東西,或者是基本元素 - char []是應用程序中最大的內存,例如最大的一代。

我真的很想知道是否有人有類似的問題,如果是的話,他們如何解決它。這開始嚴重阻礙了我的工作能力。

感謝您的任何幫助。

+0

netbeans.conf顯示** - J-XX:PermSize = 32m -J-XX:MaxPermSize = 200m **? – JoseK 2010-08-12 10:14:13

+0

我以前設置了相同的值1024m。我改變了你的建議,分別設置爲256和512。現在,它崩潰了不同。儘管它曾經因PermGen錯誤而立即炸燬,但現在它通常只是掛起,有時我會得到一個實際的錯誤,而其他時候,它會無限期地掛起。 – Lee 2010-08-12 18:34:20

+0

您需要首先使用堆轉儲來識別泄漏的對象以及使它們活着的對象。一旦你知道這一點,你可以立即解決問題(如果它足夠簡單並且你熟悉代碼所在的代碼),或者使用分析器來查明泄漏實例的分配位置。 您可以使用jmap或visualvm(jvisualvm)來獲取堆轉儲。爲了分析,你也可以使用visualvm,但是當然你可以選擇你喜歡的任何工具 - 例如。 MAT如果你想堅持免費的工具。 – 2010-08-19 11:07:53

回答

2

加入catlina.sh(或蝙蝠)該條目,它爲我工作

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 
    -server -Xms1536m -Xmx1536m 
    -XX:NewSize=256m -XX:MaxNewSize=512m -XX:PermSize=512m 
    -XX:MaxPermSize=512m -XX:+DisableExplicitGC 
+0

謝謝你,我在調試一個tomcat應用程序的時候,在Netbeans中搞砸了這些設置,直到你的問題讓它全部點擊。感謝您的回答。 – Zoidberg 2013-06-11 11:33:32

+0

@Zoidberg:最受歡迎.. – 2013-06-12 03:57:24

0

東西我已經找到追查內存泄漏有用而不運行探查器或調試器是使用「JMAP -histo「命令(帶有jdk)。將該程序的輸出保存到文件中。在應用程序運行時,每隔幾分鐘運行一次。收集輸出並查找總是數量和大小不斷增加的對象。我甚至寫了一個快速應用程序來繪製選定對象的圖形,以便真正突出顯示運行中的對象,以便更容易地查看可能發生泄漏的位置。