【问题标题】:How do I trace jmap/jhat output back to lines in my code that are causing PermGen OutOfMemory errors?如何将 jmap/jhat 输出追溯到我的代码中导致 PermGen OutOfMemory 错误的行?
【发布时间】:2014-04-06 15:54:16
【问题描述】:

我正在使用 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 错误的部分代码?

【问题讨论】:

  • “在多次部署/取消部署我的 WAR 文件之后” - 这不太可能是由代码中的任何内容引起的。这可能是由于 JBoss 没有足够快地清理未部署的 WAR,或者可能是因为您拥有对 WAR 的引用(通常这是由应用程序类加载器而不是 war 类加载器加载的东西)。在这两种情况下,JHat 和 JMap 都帮不了您。
  • 您可以尝试跟踪类加载/卸载,看看是否有什么特别奇怪的地方。查看this 了解更多信息。
  • 你说的是“+TraceClassLoading”的部分吗?如果是这样,您的意思是手动查看服务器日志并以某种方式尝试找出哪些类已加载但未卸载?
  • 是的。虽然我更喜欢使用sedsortuniq 之类的工具,而不是检查打印输出的名称。抱歉,没有解决 permgen 问题的捷径。

标签: java jboss out-of-memory permgen jhat


【解决方案1】:

如果您想跟踪类加载器泄漏,我建议您使用比 jmap 和 jhat 更高级的工具 - 例如 Eclipse Memory Analyzser (MAT)。 Here 是如何进行此类分析的分步指南。它是一个博客系列的一部分,解释了您在代码中可能犯的不同错误,以及可能引发问题的第三方库列表。

还有一个Leak prevention library,以防您想解决这个问题。

【讨论】:

    猜你喜欢
    • 2011-08-24
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    相关资源
    最近更新 更多