使用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)
两天后,我在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/#!主题/机械同情/QbmpZxp6C64