2010-09-22 139 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