【问题标题】:Garbage Collector First and JMap EOF bug垃圾收集器优先和 JMap EOF 错误
【发布时间】:2014-01-01 11:42:08
【问题描述】:

我们正在处理客户的生产服务器堆以检测和解决内存泄漏问题。为此,我们定期使用 jmap 来收集必要的信息。

但上周我们无法进行转储,因为它触发了 EOF 错误并关闭了 Tomcat 实例。

我在互联网上进行了搜索,但找不到有关此错误的任何具体信息。我们检测到它仅在使用Gc First 垃圾收集器算法时发生。

这是我们用来执行 jmap 的命令行:

jmap -dump:format=b,file=heap.bin <PID>

服务器上的Java版本:JDK 1.7.0_7 x64

有人遇到过这种错误吗?可能缺少某些配置或需要对 java/jmap 的补丁。

更新

我们收集的有关此错误的更多信息:

[root]# jmap -dump:format=b,file=heap.bin 7806
    Dumping heap to /tmp/heap.bin ...
    Exception in thread "main" java.io.IOException: Premature EOF
        at sun.tools.attach.HotSpotVirtualMachine.readInt(HotSpotVirtualMachine.java:244)
        at sun.tools.attach.LinuxVirtualMachine.execute(LinuxVirtualMachine.java:193)
        at sun.tools.attach.HotSpotVirtualMachine.executeCommand(HotSpotVirtualMachine.java:213)
        at sun.tools.attach.HotSpotVirtualMachine.dumpHeap(HotSpotVirtualMachine.java:180)
        at sun.tools.jmap.JMap.dump(JMap.java:241)
        at sun.tools.jmap.JMap.main(JMap.java:140)
[root]#

注意:目标目录有超过 500gb 的可用空间

输出到catalina.out的错误(JVM转储错误):

# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f0269cc41c6, pid=7806, tid=139647231129360
#
# JRE version: Java(TM) SE Runtime Environment (7.0_40-b43) (build 1.7.0_40-b43)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.0-b56 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.so+0x58c1c6]  DumperSupport::dump_field_value(DumpWriter*, char, unsigned char*)+0x1c6
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /opt/tomcat6/bin/hs_err_pid7806.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp

【问题讨论】:

  • 我在 JDK 1.7.0_45 中遇到了同样的问题。大多数堆转储使 VM 崩溃并转储具有您提到的相同问题框架的核心。这使得在 java 中分析内存泄漏变得不可能。你找到解决问题的方法了吗?我现在唯一能想到的就是切换回 CMS / 其他 GC。我用错误 ID 报告它:900949
  • 我仍然没有解决这些问题@mnp。我也在 12 月报告了此问题,错误 ID 为 9008971,但尚未得到任何回复。
  • 您好,我在 oracle 错误数据库中找不到您的两个错误中的任何一个,我能看到的唯一相关错误已解决 bugs.java.com/bugdatabase/view_bug.do?bug_id=6882554 但是我可以确认这仍然在 1.7u45 上发生G1
  • 你好@DrGranit!我也无法在 oracle 错误数据库中找到错误报告。真的很奇怪,但是我已经按照 JVM 转储上的所有说明完成了错误报告提交。我真的不知道这些信息去哪儿了,我只希望有人能读到它:)
  • jdk 1.7u55 仍在发生。

标签: java heap-dump jmap


【解决方案1】:

我可以通过使用一些额外的选项来解决这个问题。

java 版本“1.7.0_45”。

Java 进程配置了第一个垃圾回收算法:-XX:+UseG1GC

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

【讨论】:

  • 请告诉我在 jmap 命令中添加 java 版本的确切命令。我在互联网上没有找到该选项。我有同样的问题@stackoverflow.com/questions/36604102/…
  • 您不需要使用 jmap 命令将 java 版本作为参数传递。你可以使用java -version 命令找到java版本!!
猜你喜欢
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多