寿命测试中高负载下的 JVM 冻结

JVM Freeze under high load in longevity tests

运行 JVM:

java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

OS:

CentOS release 6.4 (Final)

JVM 选项:

-Xmx4g -Xms4g -XX:MaxPermSize=4g -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintClassHistogram -XX:+CMSClassUnloadingEnabled -verbose:gc -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+DisableExplicitGC

运行 在 OSGI 环境中,Aerospike DB,NETTY (NIO) 用于联网。

运行周末长寿测试。 这是最后一张印刷品:

[2015-12-11 09:54:51,185] INFO  : [GC pause (young)

2 天后,我在 pid 上 运行 strace,然后是下一个打印:

[2015-12-11 09:54:51,185] INFO  : [GC pause (young) 3598M->1458M(4096M), 0.0280020 secs]
[2015-12-13 11:54:54,353] INFO  : [GC pause (young) 3598M->1464M(4096M), 180001.5628870 secs]

第一次打印完成,下一次打印显示 GC 为 2 天。

jvm 在冻结期间没有响应线程转储信号 (pkill -QUIT pid)。 这种冻结每隔几天发生一次。 冻结不仅发生在 G1 收集器上,也发生在 CMS 收集器上。 我怎样才能开始调试这个,什么可能导致这个?

谢谢。

编辑: 再次冻结,这次 strace 没有解除冻结。 第二次冻结是使用jstack解除的

更新: 发现问题了!看看下面的答案。

我找到问题了!
这是 futex_wait() 中的一个内核错误,已向后移植到我们的内核版本。
您可以在这里阅读:
https://groups.google.com/forum/#!topic/mechanical-sympathy/QbmpZxp6C64