我们有一个长时间运行的服务器应用程序,运行Java 5,并对其进行了剖析,我们可以看到老年代随着时间的推移而缓慢增长。它会在进行完全GC后被正确释放,但我想能够使用堆转储在Eclipse MAT中查看不可访问的对象。我已成功使用+XX:HeapDumpOnCtrlBreak获取了堆转储,但JVM总是在转储堆之前执行GC。显然,这在Java 6上不会发生,但我们现在被困在5上。有什么方法可以防止这种情况发生吗?
我们有一个长时间运行的服务器应用程序,运行Java 5,并对其进行了剖析,我们可以看到老年代随着时间的推移而缓慢增长。它会在进行完全GC后被正确释放,但我想能够使用堆转储在Eclipse MAT中查看不可访问的对象。我已成功使用+XX:HeapDumpOnCtrlBreak获取了堆转储,但JVM总是在转储堆之前执行GC。显然,这在Java 6上不会发生,但我们现在被困在5上。有什么方法可以防止这种情况发生吗?
使用jconsole、visualvm、jmc等JMX管理控制台。 在com.sun.management中打开HotSpotDiagnostic。 选择方法dumpHeap并输入两个参数:
false
来转储所有对象。请注意,转储文件将由您所连接的JVM编写,而不是由JVisualVM编写,因此如果JVM运行在不同的系统上,则将在该系统上写入。
您尝试过JDK附带的标准jmap工具吗? jmap工具在Java 5中正式推出。
示例命令行: /java/bin/jmap -heap:format=b
结果可以使用标准jhat工具或GUI应用程序(如MAT)进行处理。
我建议使用第三方分析工具,例如YourKit,这样可以在不首先启动GC的情况下拍摄快照。额外的好处是,您可以在没有整个ctrl-break混乱的情况下拍摄快照。
VisualVM-MBeans
插件。 - Natan