如何在没有垃圾收集的情况下在Java 5上进行堆转储?

我们有一个运行Java 5的长期运行的服务器应用程序,并对其进行分析,我们可以看到老一代随着时间的推移缓慢增长。 它在完整的GC上正确释放,但我希望能够使用堆转储查看Eclipse MAT中无法访问的对象。 我已成功使用+ XX:HeapDumpOnCtrlBreak获取堆转储,但JVM在转储堆之前总是执行GC。 显然这不会发生在Java 6上,但我们暂时停留在5。 有什么办法可以防止这种情况吗?

我建议使用第三方分析器,例如YourKit ,这可能允许您在不首先启动GC的情况下拍摄快照。 添加奖金,你可以拍摄快照而不需要整个ctrl-break恶作剧。

使用jconsole或visualvm或jmc或…其他jmx管理控制台。 在com.sun.management中打开HotSpotDiagnostic。 select方法dumpHeap并输入两个参数:

  • 转储文件的路径
  • (true / false)仅转储活动对象。 使用false来转储所有对象。

请注意,转储文件将由您连接的JVM编写,而不是由JVisualVM编写,因此如果JVM在不同的系统上运行,它将写在该系统上。

在此处输入图像描述

您是否尝试过JDK附带的标准jmap工具? jmap收费在Java 5中正式引入。

示例命令行:/ java / bin / jmap -heap:format = b

结果可以使用标准的jhat工具或MAT应用程序来处理。

我在这里有一些代码可以通过编程方式在JMX上进行堆转储:

链接: JmxHeapDumper.java

源代码中的注释包含2个指向文章的链接,这些文章包含有关如何进行堆转储的有用信息。 我不确定,但如果你运气好的话,也许JMX方法会有一些避免GC的方法。 希望这可以帮助 !

jProfiler( ej-technologies )可以做到这一点。