jmap 命令 : Premature EOF 的 Java 堆转储错误

标签 java heap-memory eof heap-dump

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

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),此问题已得到修复,但我仍在获取内部版本号为 45 的 jdk 1.7 版本

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

编辑:

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

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

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

9 MB 文件是为 2 GB 堆编写的,无法用于分析。

最佳答案

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 Force. Use with jmap -dump or jmap -histo option if the pid does not respond. The live suboption is not supported in this mode.

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

关于jmap 命令 : Premature EOF 的 Java 堆转储错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36604102/

相关文章:

pyspark - 用 pip install pyspark 安装时是否有spark-defaults.conf

java - Android 内存不足错误

c - 如何在 C 中没有换行符的情况下刺激 EOF

c - 为什么我需要多个 EOF (CTRL+Z) 字符?

java - TldLocations 缓存 : null - Importing taglib on tomcat6

java - 包 javax.servlet.jsp 错误

c++ - 如何强制指针在每次启动时不保持它们的值和顺序?

c++ - 为什么我会收到 std::bad_alloc 错误

java - 找不到javax.annotation :com. springsource.javax.annotation :jar:1. 0.0 失败

java - 从嵌套列表 Spring JpaRepository 中检索对象