2011-02-13 58 views
2

我有一個C++庫,我通過JNI從Java調用。 C++代碼中存在一個偶爾會導致JVM崩潰的bug。爲了對這種崩潰保持健壯,我已經將Java程序包裝在一個shell腳本中,當它退出時重新啓動Java。大多數情況下,這種方法可行,但偶爾JVM會崩潰(將本地堆棧跟蹤打印到stderr,不能再被java調試器附加,不會消耗任何可觀的CPU時間),但不會退出,所以它不會重新啓動,直到我手動殺死它。爲什麼會發生這種情況,我能做些什麼來防止它呢?在本機代碼崩潰後,能夠保持JVM不會退出?

我在linux下運行。崩潰之後,JVM不響應SIGTERM,只響應SIGKILL。當我使用本地調試器附加到JVM進程時,我發現這些線程都被__kernel_vsyscall阻塞。

回答

2

FWIW我最終將這些死鎖追蹤到bug in glibc's malloc。這已經被稱爲多年,顯然沒有計劃來解決它。 :-(

1

我不能特別評論過程行爲,但我傾向於使用像Tanuki的服務包裝器。它主動監視JVM,並在這種情況下終止並重新啓動服務。

1

你可以寫一些C++代碼,它能正常回應上述錯誤,然後將適當的異常拋出回Java層?