从Java进程获取堆转储以调试内存泄漏

时间:2016-11-23 08:25:40

标签: java memory-leaks heap-dump jmap hprof

遵循以下流程,但我无法分析生成的转储。

  1. 我尝试使用“jmap -F -dump:format = b,file = / tmp / test.hprof”
  2. 从Linux机器上运行的Java进程获取堆转储
  3. 60秒后的Ctrl + C
  4. 使用Eclipse MAT(Memory Analyzer Tool)启动从上一步生成的堆转储,但是我看到以下错误。
  5. 在以下情况发生内部错误:“从'/users/sobhan/Test.hprof'解析堆转储”。显示java.lang.NullPointerException

    PS:我尝试过其他分析工具,如VisualVM,IBM Heap Analyzer,结果相同。我认为堆转储已损坏(在这里使用Ctrl + C是否有问题?)。如果是这样,请建议正确的方法,优雅地退出'jmap'

    提前致谢。

1 个答案:

答案 0 :(得分:0)

您需要等待堆转储完成。根据堆的大小,可能需要几秒到几分钟。至少一次,我花了20分钟(如果我没记错的话,转储的大小约为10G)。您可以尝试“-dump:live”选项,它只会转储活动对象而不会丢弃垃圾。

jmap -F -dump:live,format=b,file=<file_name.hprof> <rdu_process_id>

但是,您可能也会遇到this issue