2011-10-17 38 views
0

我懷疑在我的應用程序中,一個outofmemoryerror導致一個run()退出,但是因爲沒有日誌,所以這個錯誤是不可見的。在線程的run()中捕獲OutofMemoryError是否明智?

在這種情況下我該怎麼辦?

+0

如果'Exception'或'Error'未被捕獲,它應該出現在輸出('System.err')中。 –

+1

通常,當存在未捕獲的異常時,JRE將打印堆棧跟蹤。你在什麼運行環境下沒有日誌? –

+0

可能重複[Will OutOfMemoryError導致線程死亡?](http://stackoverflow.com/questions/7791239/will-outofmemoryerror-cause-a-thread-to-die) – EJP

回答

1

我不知道別人,但從來沒有(恕我直言)catchthrows任何擴展Error。從javadoc的國followig聲明:

不需要在其throws子句中任何錯誤 子類可能的 方法的執行過程中被拋出,但沒有抓到申報的方法,因爲這些錯誤是不正常的 應該從未發生的條件

Error印有System.err,如果你想避免OutofMemoryException,增加你的heapsace代替。

+0

只因爲他們永遠不應該發生並不意味着,他們不會發生。 Threr可能仍然是一些特殊的情況,你知道如何處理事情比失敗更優雅。在海報的情況下,至少可以停止應用程序的其餘部分,而不會使環境處於不一致的狀態。但是,我們應該記住,停止遭受oome攻擊的應用程序本身可能導致另一個應用程序。 – Jonathan

1

我不明白爲什麼你不能這麼做,因爲父線程和子線程都在同一個JVM中產生,並且它們共享相同的堆內存。雖然解釋OOM錯誤的難度要求很高here

2

您應該使用此標誌來運行您的JVM:-XX:+HeapDumpOnOutOfMemoryError以查看發生OOM時JVM內部發生了什麼。這將寫入一個HPROF文件,您可以使用分析器進行分析,Eclipse MAT對此很好。使用-XX:HeapDumpPath=/tmp來配置將HPROF寫入的路徑。

相關問題