我有一个通过JNI从Java调用的C ++库。 C ++代码中有一个错误,有时会导致JVM崩溃。为了防止此类崩溃,我将Java程序包装在Shell脚本中,该脚本会在Java退出时重新启动Java。在大多数情况下,这是可行的,但有时JVM崩溃(将本机堆栈跟踪打印到stderr,无法再由Java调试器附加,停止消耗任何可观的CPU时间),但不会退出,因此,直到我手动将其杀死后,它才能重新启动。为什么会发生这种情况,我该怎么做才能防止这种情况发生?

我在linux下运行。崩溃之后,JVM不响应SIGTERM,仅响应SIGKILL。当我使用本机调试器附加到JVM进程时,我看到在__kernel_vsyscall中所有线程都被阻塞。

最佳答案

FWIW我最终将这些死锁追溯到bug in glibc's malloc。它已经被知道很多年了,并且显然没有修复它的计划。 :-(

10-07 19:03
查看更多