JVM 经常崩溃

JVM crashes frequently

JVM 在我们的产品环境中意外且频繁地崩溃,导致 Jboss (EAP6.3) 宕机。我们已经 java7 安装了 U72

崩溃日志具有与当前线程相同的输出:

Current thread (0x00000000d1d99000): JavaThread "Lucene Merge Thread #0" daemon [_thread_in_Java, id=1144, stack(0x00000000f6a00000,0x00000000f6b00000)]

并且所有日志都充满了:

JavaThread "elasticsearch[Node BD852E44][search][T#68]" daemon [_thread_blocked, id=14396, stack(0x00000000f7b30000,0x00000000f7c30000)]

elasticsearch 与索引相关,据我所知,它在引擎盖中使用 Lucene,但我们部署了数字或应用程序如何检查这个,有人可以帮忙。完整的崩溃日志位于:http://pastebin.com/845LU9iK

看起来它没有设法记录受影响线程的堆栈跟踪。 如果所有崩溃都是一样的,那么它似乎与已知的 lucene 或 jboss 错误不匹配。

#  guarantee(result == EXCEPTION_CONTINUE_EXECUTION) failed: Unexpected result from topLevelExceptionFilter

AIUI 这表明本机异常处理中存在错误,因此这是一个错误掩盖了另一个错误,可能使此崩溃日志变得毫无用处。

所以我只能提供非常通用的建议:

  • 您使用的是较旧的 JVM 版本,请更新到最新的 java 7、java 8 甚至可能是 java 9 开发版本,然后查看它是否会消失。
    即使它们仍然崩溃,它们也可能会提供 different/more 有用的错误报告
  • 要诊断潜在的编译器错误,您可以尝试 运行 以下标志
    • -XX:-TieredCompilation 1 应该禁用 C1 编译器
    • -XX:+TieredCompilation -XX:TieredStopAtLevel=1 应该禁用 C2 编译器
    • -Xint 禁用所有 JIT,非常慢
  • hotspot-dev 邮件列表上询问以获得进一步的指导

1: Tiered compilation 是一个新的 java7 特性,它基本上结合了解释器、C1 和 C2 JIT 编译器(以前分别使用在客户端和服务器虚拟机中)进入不同的优化阶段。

他们每个人都可能有优化错误。关闭各个阶段有助于将它们隔离为潜在原因。


编辑:新的崩溃报告更有用,因为它至少有 java 帧,有趣的部分如下:

J 1559  sun.misc.Unsafe.getByte(J)B (0 bytes) @ 0x000000000178e99b [0x000000000178e960+0x3b]
j  java.nio.DirectByteBuffer.get()B+11
j  org.apache.lucene.store.ByteBufferIndexInput.readByte()B+4
J 9447 C2 org.apache.lucene.store.DataInput.readVInt()I (114 bytes) @ 0x000000000348cc00 [0x000000000348cbc0+0x40]

DataInput.readVInt 似乎是一个持续的悲伤之源,请参阅 this SO answer 了解可能的解决方案