Java 进程是如何消亡的?

How does a Java process die?

一个快速的答案当然是 "without crying" :)。

我的 Java 应用程序 (J2SE 1.7) 在 Win7 32 位系统上有一个非常奇怪的问题。我遇到了所有情况:

所以我的问题是:

how can I be sure this is a native exit call as I don't have all the code of native libraries I am using ?

我知道唯一可以确定的方法是使用日志记录命令包装对本机库的调用,这样您就可以在每次调用之前和每次调用之后进行记录 return。在您的程序崩溃后,如果日志中有一条输入消息但没有 return 消息,那么该库调用是可疑的。

Is it possible to have this strange behaviour produced by another means ?

是的,还有无数种奇怪的其他方法。 用完内存或其他一些资源可能是一种解释。

Finally how to debug and track which lib can be the root cause ?

如果消息特定于正在调用的库,则上述日志记录也应该能找到这一点。您可以在 jconsole 中监视应用程序以查看它是否用完了大量内存或线程。禁用任何可以禁用的东西,这样你就可以将它作为问题的一部分来消除。如果问题消失,一次启用一项,直到问题 returns.

How can I be sure this is a native exit call as I don't have all the code of native libraries I am using?

调试它。

Is it possible to have this strange behaviour produced by another mean?

很难说...可能是线程,可能是内存泄漏,...

Finally how to debug and track which lib can be the root cause?

运行 Java 和

-XX:+CreateMinidumpOnCrash

您将获得可以分析的故障转储。或者使用

-XX:+UseOSErrorReporting

让 Windows 处理崩溃(例如,这将显示一条消息以附加调试器,具体取决于您安装的内容。它也可能显示 "Send to Microsoft" 错误报告。)。 =15=]