我们的一个web服务器停止响应任何请求,jstack提示进程中存在死锁,serval线程被卡住,日志是这样的:
Found one Java-level deadlock:
=============================
"qtp728030296-143":
waiting to lock monitor 0x00007ff8e4002528 (object 0x0000000080005b28, a java.lang.ThreadGroup),
which is held by UNKNOWN_owner_addr=0x00007ff8d8002000
Java stack information for the threads listed above:
===================================================
"qtp728030296-143":
at java.lang.ThreadGroup.addUnstarted(ThreadGroup.java:865)
- waiting to lock <0x0000000080005b28> (a java.lang.ThreadGroup)
at java.lang.Thread.init(Thread.java:405)
at java.lang.Thread.init(Thread.java:349)
at java.lang.Thread.<init>(Thread.java:499)
at org.eclipse.jetty.util.thread.QueuedThreadPool.newThread(QueuedThreadPool.java:558)
at org.eclipse.jetty.util.thread.QueuedThreadPool.startThreads(QueuedThreadPool.java:537)
at org.eclipse.jetty.util.thread.QueuedThreadPool.access$200(QueuedThreadPool.java:49)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:728)
at java.lang.Thread.run(Thread.java:748)
似乎线程组监视器由某个未知线程持有。我用谷歌搜索了错误消息“由 UNKNOWN_owner_addr 持有”,它引导我找到这个 apache 错误线程:
它具有完全相同的错误消息,并且表明这是由JDK jemalloc 错误引起的
我不熟悉那些低级 jvm/jemalloc 的东西,它们对我来说就像魔法:)。所以我不能 100% 确定我的问题是否是由这个错误引起的。如果我正确理解了jdk bug,是否意味着所有的JDK8、11、12程序都受到了它的影响,任何java程序都可能遇到这种神秘的死锁,可能性很小?