2009-10-05 28 views
4

我使用以下參數(其中包括)-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../logs開始我的java代碼(Vista中的1.6.0_16)。我運行代碼,我可以在日誌中看到有兩個OOM。-XX:+ HeapDumpOnOutOfMemoryError不在OOM中創建hprof文件

第一個我知道,因爲我可以在該HPROF文件被創建的標準輸出看到:

java.lang.OutOfMemoryError: Java heap space 
Dumping heap to ../logs\java_pid4604.hprof ... 
Heap dump file created [37351818 bytes in 1.635 secs] 

,然後朝我的代碼得到另一個OOM結束,我抓住這一點,但我沒有創建第二個hprof文件。任何人都知道這是爲什麼?是因爲我抓住了OOM例外嗎?

回答

2

內存不足僅在第一個錯誤時生成一個轉儲文件。如果你想獲得更多,你可以試試jmap或者把jconsole保存在jvm(版本6)上,那麼你可以在所有東西崩潰之後,也就是在早上從jconsole(或你選擇的分析器工具)創建你自己的轉儲。

有關傾銷主體的更多信息,請登錄Eclipse MemoryAnalyser

4

我不會嘗試從OutOfMemoryError中恢復,因爲有些對象可能會處於未定義狀態(只考慮無法分配其數組來存儲日期的ArrayList)。

關於你的問題,我會懷疑-XX:+ HeapDumpOnOutOfMemoryError僅創建一個有意防止多堆轉儲的轉儲:想想幾個線程同時拋出一個OOME,導致每個堆轉儲拋出異常。

總結:不要嘗試從OOME恢復,也不要指望JVM寫入多個堆轉儲。但是,如果您仍然覺得需要生成堆轉儲,則可以嘗試手動處理OOME異常並調用jmap來創建轉儲或使用「-XX:+ HeapDumpOnCtrlBreak」(不確定,但是,如何以編程方式模擬CtrlBreak) 。

+0

以及我知道關於不要試圖從OOM中恢復的建議,但在這種情況下,我需要,必須,並且在很多情況下一切正常。 但你的hipothesys聽起來不錯,也許只有一個是故意創建的... 在研究這個問題時,我發現了一些在stackoverlfow中的問題,它展示瞭如何以編程方式創建轉儲,但現在找不到它 – Persimmonium 2009-10-05 10:45:07

相關問題