使用jmap命令的Java堆转储错误:过早的EOF

我在执行下面的命令时遇到了以下exception

jmap -dump:format=b,file=heap_dump.bin  

输出:

 Dumping heap to  Exception in thread "main" java.io.IOException: Premature EOF at sun.tools.attach.HotSpotVirtualMachine.readInt(HotSpotVirtualMachine.java:248) at sun.tools.attach.LinuxVirtualMachine.execute(LinuxVirtualMachine.java:199) at sun.tools.attach.HotSpotVirtualMachine.executeCommand(HotSpotVirtualMachine.java:217) at sun.tools.attach.HotSpotVirtualMachine.dumpHeap(HotSpotVirtualMachine.java:180) at sun.tools.jmap.JMap.dump(JMap.java:242) at sun.tools.jmap.JMap.main(JMap.java:140) 

JDK版本: 1.7.0_45

VM_OPT:

 -Xms2g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=1500 -XX:G1HeapRegionSize=2 -XX:+PrintFlagsFinal -XX:ParallelGCThreads=4 -XX:ConcGCThreads=2 

硬件:RHEL 5.x,4核CPU Linux机器6 GB RAM

根据oracle bug报告数据库( http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6882554 ),这个问题已经修复但我仍然得到jdk 1.7版本,内置版本号:45

除了升级到Jdk 1.8之外,您能否提出任何解决方案,由于其他依赖性,这在我的情况下是不可能的?

编辑:

我已尝试使用以下命令,此命令也不起作用( 生成部分转储文件 )并显示相同的早期EOF。

 jmap -J-d64 -dump:format=b,file=  

我已经与启动该过程的用户触发了该命令。 该用户具有该目录的写权限。 该文件已生成但尚未完成。

2 GB堆写入了9 MB文件,该文件无法用于分析。

Brian的评论有助于解决问题。

如果您在64位机器中使用G1GC算法:

以下命令不起作用(不包括live选项)

 jmap -J-d64 -dump:format=b,file=  

你必须使用下面的选项来获得堆转储

 jmap -J-d64 -dump:live,format=b,file=  

有一些建议使用-F选项来强制堆转储但是根据oracle 技术说明 :

-F力量。 如果pid没有响应,请使用jmap -dump或jmap -histo选项。 此模式不支持实时子选项。

由于G1GC选项需要堆转储,因此不能使用上面的选项。