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

2022-09-04 23:01:10

我在执行以下命令期间遇到以下异常

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

输出:

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 版本 : 1.7.0_45

VM_OPTs :

-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 内存

根据oracle错误报告数据库(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=<filename> <pid>

我已经与启动该过程的用户一起触发了该命令。该用户具有对目录的写入权限。文件已生成,但不完整。

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


答案 1

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

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

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

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

您必须使用以下选项来获取堆转储

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

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

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

由于 G1GC 选项需要堆转储,因此无法使用上述选项。


答案 2

推荐