java - 在 native 代码崩溃后,什么可以阻止 JVM 退出?

标签 java java-native-interface

我有一个 C++ 库,我通过 JNI 从 Java 调用它。 C++ 代码中存在一个错误,偶尔会导致 JVM 崩溃。为了应对此类崩溃,我将 Java 程序包装在 shell 脚本中,该脚本在退出时重新启动 java。大多数情况下,这是有效的,但偶尔 JVM 会崩溃(将 native 堆栈跟踪打印到 stderr,无法再由 java 调试器附加,停止消耗任何可观的 CPU 时间)但不退出,所以直到我用手杀死它之前它不会重新启动。为什么会发生这种情况?我可以采取什么措施来防止这种情况发生?

我在linux下运行。崩溃后,JVM 不会响应 SIGTERM,仅响应 SIGKILL。当我使用 native 调试器附加到 JVM 进程时,我看到线程全部被阻塞在 __kernel_vsyscall 中。

最佳答案

FWIW 我最终将这些僵局追溯到 bug in glibc's malloc 。这个问题多年来一直为人所知,但显然没有计划修复它。 :-(

关于java - 在 native 代码崩溃后,什么可以阻止 JVM 退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4984524/

相关文章:

java.util.regex.Pattern 与在线正则表达式调试器不一致

android - 在 Android 中从 native c 返回 jbyteArray

java - 从 Xamarin 中的 Java 绑定(bind)库接口(interface)访问属性

java - SWIG (v1.3.29) 生成的 C++ 到 Java Vector 类无法正常运行

java - 是否可以更改 Firebase 的短信验证消息?

java - 迭代器接口(interface)

java - JNI 包装器的多个实例

java - 通过自定义垃圾收集器防止 native 内存泄漏?

java - 将一串数字与 int 进行比较

java - 使用JOOQ创建测试用数据库