如何在没有垃圾收集的情况下在Java 5上进行堆转储?
我们有一个运行Java 5的长期运行的服务器应用程序,并对其进行分析,我们可以看到老一代随着时间的推移缓慢增长。 它在完整的GC上正确释放,但我希望能够使用堆转储查看Eclipse MAT中无法访问的对象。 我已成功使用+ XX:HeapDumpOnCtrlBreak获取堆转储,但JVM在转储堆之前总是执行GC。 显然这不会发生在Java 6上,但我们暂时停留在5。 有什么办法可以防止这种情况吗?
我建议使用第三方分析器,例如YourKit ,这可能允许您在不首先启动GC的情况下拍摄快照。 添加奖金,你可以拍摄快照而不需要整个ctrl-break恶作剧。
使用jconsole或visualvm或jmc或…其他jmx管理控制台。 在com.sun.management中打开HotSpotDiagnostic。 select方法dumpHeap并输入两个参数:
- 转储文件的路径
- (true / false)仅转储活动对象。 使用
false
来转储所有对象。
请注意,转储文件将由您连接的JVM编写,而不是由JVisualVM编写,因此如果JVM在不同的系统上运行,它将写在该系统上。
您是否尝试过JDK附带的标准jmap工具? jmap收费在Java 5中正式引入。
示例命令行:/ java / bin / jmap -heap:format = b
结果可以使用标准的jhat工具或MAT应用程序来处理。
我在这里有一些代码可以通过编程方式在JMX上进行堆转储:
链接: JmxHeapDumper.java
源代码中的注释包含2个指向文章的链接,这些文章包含有关如何进行堆转储的有用信息。 我不确定,但如果你运气好的话,也许JMX方法会有一些避免GC的方法。 希望这可以帮助 !
jProfiler( ej-technologies )可以做到这一点。
- 无法自动配置DataSource:未指定“spring.datasource.url”
- 媒体:在JAR中播放WAV文件
- Java Swing:多个窗口
- 在Consumer和Producer Threads中等待并通知
- 使用CloseableHttpClient的不受支持的记录版本SSLv2Hello
- GUI TextArea中的java for循环
- java.lang.NoClassDefFoundError:com / sun / istack / localization / Localizable?
- 如何使用swing组件为JLabel添加刷新计时器
- 如何在@括号(“Luke”)之类的java注释中使用括号内没有属性?