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

jth*_*thg 5 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并在那里进行调试.

谢谢.

ska*_*man 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。

PS你真的需要升级到java 6....