如何在不进行垃圾回收的情况下,在Java 5上生成堆转储文件?

13

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

5个回答

14

使用jconsole、visualvm、jmc等JMX管理控制台。 在com.sun.management中打开HotSpotDiagnostic。 选择方法dumpHeap并输入两个参数:

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

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

输入图像描述


2
请注意,VisualVM需要VisualVM-MBeans插件。 - Natan

4

您尝试过JDK附带的标准jmap工具吗? jmap工具在Java 5中正式推出。

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

结果可以使用标准jhat工具或GUI应用程序(如MAT)进行处理。


3
我有一些代码可以通过JMX程序化地进行堆转储:
链接:JmxHeapDumper.java 源代码中的注释包含两个链接,这些链接包含有关如何获取堆转储的有用信息。我不确定,但如果你很幸运,也许JMX方法可以避免GC。希望这可以帮助!

好的,谢谢。我会看一下并查看它是否在之前进行了垃圾回收。实际上,能够以编程方式完成这项工作似乎非常有用。 - Colin

1

我建议使用第三方分析工具,例如YourKit,这样可以在不首先启动GC的情况下拍摄快照。额外的好处是,您可以在没有整个ctrl-break混乱的情况下拍摄快照。


谢谢,我实际上有一份JProfiler的副本,但我没有意识到它可以做到这一点。我会试一下。 - Colin

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接