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

有帮助吗?

解决方案

我建议第三方探查如 YourKit ,这让您可以拍摄快照没有首先拉开GC。额外的奖励,你可以采取一个快照而不整CTRL破诡计。

其他提示

使用 jconsole 或 VisualVM 或 jmc 或...其他jmx管理控制台。在 com.sun.management 中打开 HotSpotDiagnostic。选择方法 转储堆 并输入两个参数:

  • 转储文件的路径
  • (正确/错误)仅转储活动对象。使用 false 转储所有对象。

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

enter image description here

您是否尝试过JDK附带的标准JMAP工具? 该JMAP人数在Java 5中正式推出。

实施例的命令行: / JAVA / bin中/ JMAP -heap:格式= B

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

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

关联: JmxHeapDumper.java

源代码中的注释包含 2 个文章链接,其中包含有关如何进行堆转储的有用信息。我不确定,但如果你幸运的话,也许 JMX 方法可以通过某种方式避免 GC。希望这可以帮助 !

的JProfiler( EJ-技术)可以做到这一点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top