我正在尝试诊断Sun One 9.1 Application Server中的PermGen内存泄漏问题。为了做到这一点,我需要获得JVM进程的堆转储。不幸的是,JVM进程是在Windows上运行的1.5版本。显然,触发堆转储的方法都不支持该设置。我可以让JVM在内存耗尽或关闭后执行堆转储,但我需要能够在任意时间获取堆转储。
两种经常提到的获取堆转储的方法是使用jmap或使用HotSpotDiagnostic MBean。这些都不支持Windows上的jvm 1.5。
有没有我错过的方法?如果有一种方法可以以编程方式触发堆转储(不使用HotSpotDiagnostic MBean),那也会这样做......
如果在Windows中真的不可能这样做,我想我不得不求助于构建Linux VM并在那里进行调试。
感谢。
答案 0 :(得分:1)
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。
P.S。你真的需要升级到java 6 ....
答案 1 :(得分:0)
如果是1.5.0_14或更高版本,您可以使用-XX:+HeapDumpOnCtrlBreak
并在控制台中按Ctrl-Break