触发在Windows上运行的1.5 JVM的堆转储

时间:2010-06-28 21:06:14

标签: java windows jvm

我正在尝试诊断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并在那里进行调试。

感谢。

2 个答案:

答案 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