我正在尝试诊断 Sun One 9.1 应用程序服务器中的 PermGen 内存泄漏问题。为此,我需要获取 JVM 进程的堆转储。不幸的是,JVM 进程是在 Windows 上运行的 1.5 版本。显然,触发堆转储的方法都不支持该设置。我可以让 JVM 在内存耗尽或关闭时执行堆转储,但我需要能够在任意时间获取堆转储。
两种经常提到的获取堆转储的方法是使用 jmap 或使用 HotSpotDiagnostic MBean。它们都不支持 Windows 上的 jvm 1.5。
有没有我错过的方法?如果有一种方法可以以编程方式触发堆转储(不使用 HotSpotDiagnostic MBean),那也可以......
如果确实无法在 Windows 中做到这一点,我想我必须求助于构建 Linux 虚拟机并在那里进行调试。
Thanks.
Java6 中引入了一个新的热点选项,-XX:-HeapDumpOnOutOfMemoryError
,它实际上向后移植到了 Java5 JVM。
http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp
何时将堆转储到文件
抛出 java.lang.OutOfMemoryError 。
易于管理。 (1.4.2中介绍
更新 12、5.0 更新 7。)
这非常方便。 JVM 的生存时间刚好足以将其堆转储到文件中,然后就崩溃了。
当然,这确实意味着您必须等待泄漏严重到足以触发OutOfMemoryError
.
另一种方法是使用分析器,例如YourKit。这提供了获取正在运行的 JVM 的堆快照的方法。我相信它仍然支持Java5。
附:你really需要升级到java 6....
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)