我懷疑在我的應用程序中,一個outofmemoryerror導致一個run()退出,但是因爲沒有日誌,所以這個錯誤是不可見的。在線程的run()中捕獲OutofMemoryError是否明智?
在這種情況下我該怎麼辦?
我懷疑在我的應用程序中,一個outofmemoryerror導致一個run()退出,但是因爲沒有日誌,所以這個錯誤是不可見的。在線程的run()中捕獲OutofMemoryError是否明智?
在這種情況下我該怎麼辦?
我不知道別人,但從來沒有(恕我直言)catch
或throws
任何擴展Error
。從javadoc的國followig聲明:
不需要在其throws子句中任何錯誤 子類可能的 方法的執行過程中被拋出,但沒有抓到申報的方法,因爲這些錯誤是不正常的 應該從未發生的條件。
的Error
印有System.err
,如果你想避免OutofMemoryException
,增加你的heapsace代替。
只因爲他們永遠不應該發生並不意味着,他們不會發生。 Threr可能仍然是一些特殊的情況,你知道如何處理事情比失敗更優雅。在海報的情況下,至少可以停止應用程序的其餘部分,而不會使環境處於不一致的狀態。但是,我們應該記住,停止遭受oome攻擊的應用程序本身可能導致另一個應用程序。 – Jonathan
我不明白爲什麼你不能這麼做,因爲父線程和子線程都在同一個JVM中產生,並且它們共享相同的堆內存。雖然解釋OOM錯誤的難度要求很高here
您應該使用此標誌來運行您的JVM:-XX:+HeapDumpOnOutOfMemoryError
以查看發生OOM時JVM內部發生了什麼。這將寫入一個HPROF文件,您可以使用分析器進行分析,Eclipse MAT對此很好。使用-XX:HeapDumpPath=/tmp
來配置將HPROF寫入的路徑。
如果'Exception'或'Error'未被捕獲,它應該出現在輸出('System.err')中。 –
通常,當存在未捕獲的異常時,JRE將打印堆棧跟蹤。你在什麼運行環境下沒有日誌? –
可能重複[Will OutOfMemoryError導致線程死亡?](http://stackoverflow.com/questions/7791239/will-outofmemoryerror-cause-a-thread-to-die) – EJP