Java进程是如何死的?

时间:2015-09-03 16:16:24

标签: java java-native-interface crash-dumps

快速回答当然是“不哭”。)。

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

  • 有时它会耗尽Java堆的内存(所以我可以记录它并从中恢复)
  • 有时它在本机中崩溃,我有hs_err_pidxxxx.log文件,我可以分析发生了什么。
  • 有时它在本机中崩溃,我没有hs_err文件,但是我有一个弹出式java停止运行,我可以在Windows事件日志中看到异常,甚至可以用视觉调试过程的某些部分。
  • 有时会崩溃,我什么都没有(没有hs_err,没有弹出窗口,什么都没有......)。如果有System.exit()或本地exit()来电,它就会结束。

所以我的问题是:

  • 我怎么能确定这是一个原生退出调用,因为我没有我正在使用的本机库的所有代码?
  • 是否有可能由另一个意思产生这种奇怪的行为?
  • 最后如何调试和跟踪哪个lib可能是根本原因?

2 个答案:

答案 0 :(得分:1)

  

我怎么能确定这是一个原生退出电话,因为我没有全部   我正在使用的本机库代码?

我知道确定的唯一方法是使用日志记录命令将调用包装到本机库,以便在每次调用之前和每次返回之后进行记录。如果日志有输入消息但没有返回消息,程序崩溃后,该库调用是可疑的。

  

是否有可能让另一个人产生这种奇怪的行为   是什么意思?

是的,还有无数奇怪的其他手段。 使用内存或其他资源可能只是一种解释。

  

最后如何调试和跟踪哪个lib可能是根本原因?

如果消息特定于调用哪个库,则上述记录也应该找到。您可以在jconsole中监视应用程序,看它是否耗尽了大量的内存或线程。禁用任何可以禁用的内容,以便将其作为问题的一部分予以消除。如果问题消失,则在问题返回之前一次启用一个问题。

答案 1 :(得分:1)

  

我怎么能确定这是一个原生退出调用,因为我没有我正在使用的本机库的所有代码?

调试它。

  

是否有可能让这种奇怪的行为产生另一种意思?

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

  

最后如何调试和跟踪哪个lib可能是根本原因?

使用

运行Java
-XX:+CreateMinidumpOnCrash

你会得到一个可以分析的崩溃转储。或者使用

-XX:+UseOSErrorReporting

让Windows处理崩溃(例如,根据您安装的内容,将显示附加调试器的消息。它可能会显示“发送给Microsoft”错误报告。)。