2014-03-04 20 views
0

我使用的是JBoss 7.1.3,JDK 1.6和Mac 10.9.1。多項展開時的後/使用Maven的JBoss作爲插件我的WAR文件將取消部署,我的服務器與下面的錯誤死亡......如何追蹤jmap/jhat輸出回我的代碼中導致PermGen OutOfMemory錯誤的行?

15:05:10,120 ERROR [org.xnio.listener] (Remoting "daves-macbook-pro:MANAGEMENT" read-1) A channel event listener threw an exception: java.lang.OutOfMemoryError: PermGen space 

sudo jmap -dump:format=b,file=/tmp/leak 16274 
sudo jhat -J-Xmx2048m /private/tmp/leak 

但是,當我瀏覽結果頁面,http://locohost.mymachine.com:7000/(除非它說:「本地主機」和不是「locohost.mymachine.com」),輸出是完全難以辨認的。有一堆一起,我們已經寫類的引用線,例如

Package org.mainco.subco.myproject.interaction.domain 
class org.mainco.subco.myproject.interaction.domain.Note [0x2d145258] 
class org.mainco.subco.myproject.interaction.domain.NoteDto [0x2a8de180] 
class org.mainco.subco.myproject.interaction.domain.Note_ [0x2baa5980] 

但是我怎麼追查這回正在促進這些的PermGen錯誤的我們的代碼部分?

+0

「在對我的WAR文件進行多次部署/設置後」 - 這不太可能是由代碼中的任何內容引起的。這可能是由於JBoss沒有足夠快地清理未部署的WAR,或者可能是因爲你有一些對WAR的引用(通常這是應用程序類加載器而不是戰爭類加載器加載的東西)。在這兩種情況下,JHat和JMap都不會幫助你。 – kdgregory

+0

你可以嘗試跟蹤類加載/卸載,看看有什麼特別奇怪的。請參閱[this](http://www.kdgregory.com/index.php?page=java.outOfMemory#permgen)瞭解更多信息。 – kdgregory

+0

你說的是關於「+ TraceClassLoading」的部分嗎?如果是這樣,你的意思是手動通過服務器日誌,並以某種方式試圖找出什麼類被加載,但沒有卸載? – Dave

回答

0

如果你想追蹤類加載器泄漏,我建議你使用比jmap和jhat更高級別的工具 - 比如Eclipse內存分析器(MAT)。 Here是一步一步指導如何做這樣的分析。它是博客系列的一部分,它解釋了您在代碼中可能犯的不同錯誤,以及可能觸發問題的第三方庫列表。如果你想擺脫這個問題,還有一個Leak prevention library

相關問題