Что может помешать выходу JVM после сбоя в нативном коде? - PullRequest
2 голосов
/ 13 февраля 2011

У меня есть библиотека C ++, которую я вызываю из Java через JNI. В коде C ++ есть ошибка, которая иногда приводит к сбою JVM. Чтобы быть устойчивым к таким сбоям, я обернул программу Java в сценарий оболочки, который перезапускает Java при выходе. В большинстве случаев это работает, но время от времени происходит сбой JVM (выводит собственную трассировку стека в stderr, больше не может быть присоединен отладчиком java, перестает потреблять сколько-нибудь заметное количество процессорного времени), но не завершается так что он не возобновится, пока я не убью его вручную. Почему это может произойти и что я могу сделать, чтобы предотвратить это?

Я работаю под Linux. После сбоя JVM не отвечает на SIGTERM, а только на SIGKILL. Когда я присоединяюсь к процессу JVM с помощью собственного отладчика, я вижу, что все потоки заблокированы в __kernel_vsyscall.

Ответы [ 3 ]

2 голосов
/ 24 февраля 2011

FWIW Я в конечном итоге отследил эти тупики до ошибки в malloc glibc. Это было известно в течение многих лет, и, видимо, нет никаких планов, чтобы исправить это. : - (

1 голос
/ 13 февраля 2011

Можете ли вы написать какой-нибудь код C ++, который изящно реагирует на упомянутую ошибку, а затем выдать правильное исключение обратно на уровень Java?

1 голос
/ 13 февраля 2011

Я не могу комментировать конкретно поведение процесса, хотя я был бы склонен использовать что-то вроде оболочки сервиса Tanuki.Он активно контролирует JVM и при таких обстоятельствах уничтожит его и перезапустит службу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...