Java 如何将jmap/jhat输出跟踪回代码中导致PermGen OutOfMemory错误的行?
我正在使用JBoss7.1.3、JDK1.6和Mac10.9.1。在使用Maven Jboss作为插件多次部署/取消部署我的WAR文件后,我的服务器因以下错误而死亡Java 如何将jmap/jhat输出跟踪回代码中导致PermGen OutOfMemory错误的行?,java,jboss,out-of-memory,permgen,jhat,Java,Jboss,Out Of Memory,Permgen,Jhat,我正在使用JBoss7.1.3、JDK1.6和Mac10.9.1。在使用Maven Jboss作为插件多次部署/取消部署我的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: PermGe
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
但是当我访问结果页面时,除了显示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内存分析器MAT。是如何进行此类分析的逐步指南。它是解释代码中可能犯的不同错误的博客系列的一部分,以及可能引发问题的第三方库的列表
在多次部署/取消部署我的WAR文件后,如果您想解决此问题,也会遇到一个问题。这不太可能是由代码中的任何内容造成的。这可能是因为JBoss没有足够快地清理未部署的WAR,或者可能是因为您有一些东西保存了对WAR的引用,这通常是由应用程序类加载器而不是WAR类加载器加载的。在这两种情况下,JHat和JMap都帮不了你。你可以尝试跟踪类的加载/卸载,看看是否有什么特别奇怪的地方。查看更多信息。您是在谈论有关+TraceClassLoading的部分吗?如果是这样的话,您的意思是手动查看服务器日志并设法找出哪些类已加载但未卸载?是的。尽管我更喜欢使用sed、sort和uniq等工具,而不是从打印输出中检查名称。很抱歉,永久发电机问题没有捷径。