如何在不使用垃圾回收的情况下在Java 5上进行堆转储?
我们有一个运行Java 5的长时间运行的服务器应用程序,并且通过分析我们可以看到,随着时间的推移,老一代增长缓慢。它在一个完整的GC上正确释放,但我希望能够使用堆转储查看Eclipse MAT中不可访问的对象。我已经使用+ XX:HeapDumpOnCtrlBreak成功获得堆转储,但JVM在转储堆之前始终执行GC。显然这不会发生在Java 6上,但现在我们被困在了5上。有什么办法可以防止这种情况发生?如何在不使用垃圾回收的情况下在Java 5上进行堆转储?
我这里有一些代码,可以编程采取堆转储在JMX:
在源代码中的注释包含2个链接到包含有关如何采取堆有用信息的文章转储。我不知道,但如果你运气好,也许JMX的方法会有一些避免GC的方法。希望这可以帮助 !
太好了,谢谢,我会去看看,看看它是否提前GC。实际上,以编程方式实现它似乎非常有用。 – Colin 2009-08-14 15:13:39
您是否尝试过JDK附带的标准jmap工具? 的JMAP收费用Java正式引入5.
实施例的命令行: /JAVA/bin中/ JMAP -heap:格式= B
结果可以使用标准工具与jHat或GUI应用程序进行处理如MAT。
使用jconsole或visualvm或jmc或...其他jmx管理控制台。 在com.sun.management中打开HotSpotDiagnostic。 选择方法dumpHeap和输入两个参数:
- 路径转储文件
- (真/假)仅转储活动对象。使用
false
转储所有对象。
请注意,转储文件将由您连接到的JVM写入,而不是由JVisualVM写入,因此如果JVM在其他系统上运行,它将写入该系统。
谢谢,我其实有JProfiler的副本,但我没有意识到这一点能做到这一点。我会放弃它。 – Colin 2009-08-14 14:59:40