Java 进程是如何消亡的?
How does a Java process die?
一个快速的答案当然是 "without crying" :)。
我的 Java 应用程序 (J2SE 1.7) 在 Win7 32 位系统上有一个非常奇怪的问题。我遇到了所有情况:
- 有时它会超出 Java 堆的内存(因此我可以记录它并从中恢复)
- 有时它会在本机中崩溃,我有
hs_err_pidxxxx.log
文件,我可以分析发生了什么。
- 有时它在本机中崩溃,我没有
hs_err
文件,但我有一个弹出窗口 java 停止运行,我可以在 windows 事件日志甚至调试中看到异常可视化过程的某些部分。
- 有时它会崩溃,我什么都没有(没有 hs_err,没有弹出窗口,什么都没有...)。它就像有
System.exit()
或本机 exit()
调用一样结束。
所以我的问题是:
- 我如何确定这是本机退出调用,因为我没有我正在使用的本机库的所有代码?
- 这种奇怪的行为是否可能由另一种方式产生?
- 最后如何调试和跟踪哪个库可能是根本原因?
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=]
一个快速的答案当然是 "without crying" :)。
我的 Java 应用程序 (J2SE 1.7) 在 Win7 32 位系统上有一个非常奇怪的问题。我遇到了所有情况:
- 有时它会超出 Java 堆的内存(因此我可以记录它并从中恢复)
- 有时它会在本机中崩溃,我有
hs_err_pidxxxx.log
文件,我可以分析发生了什么。 - 有时它在本机中崩溃,我没有
hs_err
文件,但我有一个弹出窗口 java 停止运行,我可以在 windows 事件日志甚至调试中看到异常可视化过程的某些部分。 - 有时它会崩溃,我什么都没有(没有 hs_err,没有弹出窗口,什么都没有...)。它就像有
System.exit()
或本机exit()
调用一样结束。
所以我的问题是:
- 我如何确定这是本机退出调用,因为我没有我正在使用的本机库的所有代码?
- 这种奇怪的行为是否可能由另一种方式产生?
- 最后如何调试和跟踪哪个库可能是根本原因?
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=]