【问题标题】:What could keep the JVM from exiting after a crash in native code?在本机代码崩溃后,什么可以阻止 JVM 退出?
【发布时间】:2011-02-13 13:58:44
【问题描述】:

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

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

【问题讨论】:

    标签: java java-native-interface


    【解决方案1】:

    FWIW 我最终将这些死锁追溯到bug in glibc's malloc。它已为人所知多年,显然没有修复它的计划。 :-(

    【讨论】:

      【解决方案2】:

      我无法具体评论进程行为,但我倾向于使用 Tanuki 的服务包装器之类的东西。它会主动监视 JVM,并在这些情况下将其杀死并重新启动服务。

      【讨论】:

        【解决方案3】:

        您能否编写一些 C++ 代码优雅地响应上述错误,然后将适当的异常抛出回 Java 层?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多