2010-09-22 119 views
1

有没有办法让Java应用程序转储文件,其中包含有关JVM崩溃原因的信息?获取有关JVM崩溃的信息

+0

好问题,但你打算怎么办?你是JVM开发人员吗?如果* JVM *崩溃,那么JVM就会出错。下面是一个(1K视图)问题,我问了如何处理可以随意触发的可重复JVM崩溃:http://stackoverflow.com/questions/2299250 – SyntaxT3rr0r 2010-09-22 02:14:42

+0

我正在处理java字节码。看起来,当有一个无效的函数java喜欢崩溃没有警告。这可能是错误正在某处处理。反正有没有得到线程抛出的最后一个java异常? – Will 2010-09-22 13:48:06

回答

1

如果你不意味着实际JVM崩溃了程序错误,但更多的,你有这带来了你的程序下来意外的是,你可以在你的主要方法使用一个try-catch异常:

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

这将捕获任何种类的'Error',包括'OutOfMemoryError',它本身需要一些内存来处理...听起来对我来说是个坏主意。 – whiskeysierra 2010-09-22 07:24:41

+0

有更好的建议呢? – 2010-09-22 07:52:41

+0

Willi,无论如何处理OutOfMemoryError都需要内存? – Will 2010-09-22 17:32:44

0

在jdk中,您有一个名为jmap的工具来转储内存并分析对象。

+0

如果它结束了,你将如何转储?我想我可以在最后添加一个Thread.Sleep,但有没有更好的方法? – Will 2010-09-22 16:22:16

+0

对不起,我没有任何其他的想法。 – 2010-09-22 18:57:20

1

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

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

+0

如果异常被未记录的try/catch处理并处理,该怎么办?有什么办法可以获得线程抛出的最后一个java异常? – Will 2010-09-22 14:35:38

+0

@高:我不认为有。 try/catch块负责处理异常并适当地执行操作(例如:取消操作和/或记录某些内容)。这就是为什么人们(几乎)不会使用空的catch块。但即使“吞咽”异常也不会导致JVM崩溃或线程死亡。只有未捕获的异常可以这样做。 – 2010-09-23 07:50:39