我正在尝试诊断Sun One 9.1应用程序服务器中的PermGen内存泄漏问题。 为了做到这一点,我需要得到一个JVM进程的堆转储。 不幸的是,JVM进程是在Windows上运行的1.5版本。 显然,触发堆转储的方式都不支持该设置。 我可以让JVM在内存耗尽或closures时执行堆转储,但是我需要能够在任意时间获得堆转储。
经常提到的两种获取堆转储的方法是使用jmap或使用HotSpotDiagnostic MBean。 这些都不支持Windows上的jvm 1.5。
有没有我错过的方法? 如果有办法以编程方式触发一个堆转储(不使用HotSpotDiagnostic MBean),那也可以…
如果在Windows中无法做到这一点,我想我不得不求助于构build一个Linux VM并在那里进行debugging。
谢谢。
在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 ….
如果是1.5.0_14或更高版本,则可以使用-XX:+HeapDumpOnCtrlBreak
并在控制台中按Ctrl-Break