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

Col*_*lin 8 java garbage-collection heap-memory

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

dag*_*ett 12

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

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

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

在此输入图像描述

  • 请注意,VisualVM 为此需要“VisualVM-MBeans”插件。 (2认同)

ska*_*man 1

我建议使用第 3 方分析器,例如YourKit,它可以让您无需先启动 GC 即可拍摄快照。额外的好处是,您可以拍摄快照,而无需整个 ctrl-break 恶作剧。