【问题标题】:Get information on JVM crashing获取有关 JVM 崩溃的信息
【发布时间】:2010-09-22 01:27:20
【问题描述】:

是否有 java 应用程序转储文件,其中包含有关 JVM 崩溃原因的信息?

【问题讨论】:

  • 问得好,但是你打算怎么做呢?您是 JVM 开发人员吗?如果 JVM 崩溃,则 JVM 几乎是错误的。这是一个(1K 视图)问题,我询问了如何处理我可以随意触发的可重现 JVM 崩溃:stackoverflow.com/questions/2299250
  • 我正在处理 java 字节码。似乎当有一个无效的函数时,java 喜欢在没有警告的情况下崩溃。可能是某个地方正在处理错误。有没有办法得到线程抛出的最后一个 java 异常?

标签: java jvm


【解决方案1】:

如果您的意思不是实际的 JVM 因程序错误而崩溃,而是您遇到异常导致程序意外停机,您可以在 main 方法中使用 try-catch:

public static void main(String args[]) {
  try {
    doStuff();
  } catch (Throwable e) {
    e.printStackTrace();
    logStuff(e);
  }
}

【讨论】:

  • 这将捕获任何类型的Error,包括OutOfMemoryError,它本身需要一些内存来处理......对我来说听起来是个坏主意。
  • 有更好的建议吗?
  • Willi,无论如何都不会处理 OutOfMemoryError 需要内存?
  • 将此标记为答案,因为问题是我使用 Exception 而不是 Throwable。
  • 奇怪的是,在 try/catch 上面的 Throwable 处理程序我没有捕捉到它。 Java 不会重新抛出异常吗?
【解决方案2】:

如果 JVM 因本机代码(即通过 JNI 访问的代码 - 不一定是 JVM 本身)中的错误而崩溃,则 JVM(通常)会产生堆转储。默认情况下,它是在 JVM 工作目录中名为 hs_err_pidXXXX.log 的文件中创建的(XXXX 是进程 ID)。

如果您的意思是 Java 程序本身崩溃,here 是一篇关于如何为未捕获的异常设置处理程序的好文章。然后,您可以将它们(以及相关的堆栈跟踪)记录到文件中。

【讨论】:

  • 如果异常被不记录的 try/catch 捕获和处理怎么办?有什么方法可以获取线程抛出的最后一个 java 异常?
  • @High:我认为没有。 try/catch 块负责处理异常并采取适当的行动(例如:取消操作和/或记录某些内容)。这就是为什么应该(几乎)永远不要使用空的 catch 块。但即使是“吞下”异常也绝对不会导致 JVM 崩溃或线程死亡。只有未捕获的异常才能这样做。
【解决方案3】:

【讨论】:

  • 有windows指南吗?
【解决方案4】:

您可以使用DebugDiag 工具或IBM Memory Analyzer。后者有很多教程。希望这会有所帮助。

【讨论】:

    【解决方案5】:

    在 jdk 中有一个叫做 jmap 的工具来转储内存和 jhat 来分析对象。

    【讨论】:

    • 如果它即将结束,你会如何转储?我想我可以在最后添加一个 Thread.Sleep,但是有更好的方法吗?
    • 对不起,我没有其他想法。
    猜你喜欢
    • 2011-05-13
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    相关资源
    最近更新 更多