Java heap dump error with jmap command : Premature

2019-01-27 16:32发布

问题:

I have encountered below exception during execution of below command

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

output:

Dumping heap to <file_name>
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 version : 1.7.0_45

VM_OPTs :

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

Hardware : RHEL 5.x, 4 core CPU Linux machine 6 GB RAM

As per oracle bug report database ( http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6882554), this issue has been fixed state but I am still getting jdk 1.7 version with build no:45

Can you suggest any solution other than upgrading to Jdk 1.8, which is not possible in my case due to other dependencies?

EDIT:

I have tried with below command and this command too does not work (generated partial dump file) and shows same Premature EOF.

jmap -J-d64 -dump:format=b,file=<filename> <pid>

I have triggered the command with the user, who started the process. That user had write permissions to the directory. The file was generated but it was incomplete.

9 MB file was written for 2 GB heap, which is not usable for analysis.

回答1:

Brian's comment is helpful to resolve the issue.

If you are using G1GC algorithm in 64 bit machine:

Below command does not work ( excluding live option)

jmap -J-d64 -dump:format=b,file=<heap_dump_filename> <pid>

you have to use below option to get the heap dump

jmap -J-d64 -dump:live,format=b,file=<heap_dump_filename> <PID>

There are some suggestions to use -F option to force heap dump but as per oracle technotes:

-F Force. Use with jmap -dump or jmap -histo option if the pid does not respond. The live suboption is not supported in this mode.

Since heap dump is required with G1GC option, above option can't be used.