【问题标题】:Trigger Heap Dump of a 1.5 JVM running on Windows触发在 Windows 上运行的 1.5 JVM 的堆转储
【发布时间】:2010-06-28 21:06:14
【问题描述】:

我正在尝试诊断 Sun One 9.1 应用服务器中的 PermGen 内存泄漏问题。为此,我需要获取 JVM 进程的堆转储。不幸的是,JVM 进程是在 Windows 上运行的 1.5 版。显然,触发堆转储的方法都不支持该设置。我可以让 JVM 在内存不足或关闭后进行堆转储,但我需要能够在任意时间获得堆转储。

获取堆转储的两种常用方法是使用 jmap 或使用 HotSpotDiagnostic MBean。这些都不支持 Windows 上的 jvm 1.5。

有没有我错过的方法?如果有办法以编程方式触发堆转储(不使用 HotSpotDiagnostic MBean),那也可以......

如果在 Windows 中确实无法做到,我想我不得不求助于构建 Linux VM 并在那里进行调试。

谢谢。

【问题讨论】:

  • 我使用了 -XX:+HeapDumpOnOutOfMemoryError 和一个试图分配非常大数组的 jsp 页面。当我需要内存转储时,我可以直接点击 jsp 页面。效果很好。

标签: java windows jvm


【解决方案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。

附:你真的需要升级到java 6....

【讨论】:

  • 谢谢。我一直在使用这种方法,但还不够。我需要在任意时间以某种方式触发堆转储。
  • "P.S. 你真的需要升级到 java 6..." - 我希望 :)
  • @jthg - 你显然没有足够努力地击败你的管理层/客户/供应商:-)
【解决方案2】:

如果是1.5.0_14 或更高版本,您可以使用-XX:+HeapDumpOnCtrlBreak 并在控制台中按Ctrl-Break

【讨论】:

  • 如果没有控制台,可以将Ctrl-Break发送到进程吗?或者你知道是否有办法让 Sun One App 服务器为 jvm 进程保持一个控制台打开?
  • 不确定 Sun One 服务器。常见的方法有: 1- 编辑启动脚本(如果有的话)并用java替换javaw; 2-找到主类并手动运行它
猜你喜欢
  • 2022-10-19
  • 2016-08-28
  • 1970-01-01
  • 2011-01-08
  • 2016-03-06
  • 2011-05-06
  • 2011-12-13
  • 2020-04-27
  • 2013-07-31
相关资源
最近更新 更多