我使用的是JBoss 7.1.3,JDK 1.6和Mac 10.9.1。 在使用Maven Jboss AS插件多次部署/取消部署我的WAR文件后,我的服务器因以下错误而死亡...
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/(除了它说"localhost"而不是"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 错误的代码部分呢?
如果你想追踪类加载器泄漏,我建议你使用一些比jmap和jhat更高级的工具 - 比如Eclipse Memory Analyzser(MAT)。以下是如何进行此类分析的分步指南。它是博客系列的一部分,该系列解释了您在代码中可能犯的不同错误,以及可能触发问题的第三方库列表。
还有一个泄漏预防库,以防您想摆脱该问题。