使用 jmap 命令的 Java 堆转储错误:过早的 EOF
Posted
技术标签:
【中文标题】使用 jmap 命令的 Java 堆转储错误:过早的 EOF【英文标题】:Java heap dump error with jmap command : Premature EOF 【发布时间】:2016-08-04 21:15:28 【问题描述】:我在执行下面的命令时遇到了下面的异常
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_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 错误报告数据库 (http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6882554),此问题已得到修复,但我仍然获得 jdk 1.7 版本,内部版本号:45
除了升级到 Jdk 1.8 之外,您能否提出任何解决方案,在我的情况下,由于其他依赖关系,这是不可能的?
编辑:
我已尝试使用以下命令,但此命令也不起作用(生成的部分转储文件)并显示相同的 Premature EOF。
jmap -J-d64 -dump:format=b,file=<filename> <pid>
我已通过启动该过程的用户触发了该命令。该用户对该目录具有写入权限。文件已生成,但不完整。
9 MB 文件是为 2 GB 堆写入的,不可用于分析。
【问题讨论】:
两件事:你在哪个目录运行 jmap 以及作为什么用户? 我触发了启动该过程的用户的命令。该用户对该目录具有写入权限。文件已生成,但不完整。为 2 GB 堆写入 9 MB 文件。 可能的解释包括文件系统配额、完整文件系统或ulimit
。此外,您发现的错误是针对 MVM (oracle.com/technetwork/articles/java/mvm-141094.html) 而不是 Java。你没有使用 MVM。
看起来 JVM 在堆转储期间崩溃了。有hs_err_pid.log
崩溃日志吗?也可以尝试强制模式 (jmap -F
)。
This answer 建议在您的-dump
中使用live
:jmap -J-d64 -dump:live,format=b,file=<filename> <pid>
。这很可能是由于-XX:+UseGCG1
用于垃圾收集。你可以试试看它是否有效?
【参考方案1】:
Brian 的评论有助于解决问题。
如果你在 64 位机器上使用G1GC
算法:
以下命令不起作用(不包括live
选项)
jmap -J-d64 -dump:format=b,file=<heap_dump_filename> <pid>
您必须使用以下选项来获取堆转储
jmap -J-d64 -dump:live,format=b,file=<heap_dump_filename> <PID>
有一些建议使用-F
选项强制堆转储,但根据oracle technotes:
-F 力量。如果 pid 没有响应,请与 jmap -dump 或 jmap -histo 选项一起使用。此模式不支持 live 子选项。
由于 G1GC 选项需要堆转储,因此无法使用上述选项。
【讨论】:
以上是关于使用 jmap 命令的 Java 堆转储错误:过早的 EOF的主要内容,如果未能解决你的问题,请参考以下文章
深入理解Java虚拟机——虚拟机堆转储快照分析工具(jhat)