我正在使用mstor庫來分析mbox郵件文件。某些文件的大小超過了千兆字節。如你所想,這可能會導致一些堆空間問題。Java - 避免重複手動垃圾回收 - mstor和javaxmail OutOfMemoryError
有一個循環,對於每個迭代,檢索一個特定的消息。 getMessage()
調用是當它耗盡時試圖分配堆空間。如果我在此循環的頂部添加一個System.gc()
的調用,程序將毫無錯誤地解析大文件,但我意識到收集垃圾40,000次必須減慢程序的運行速度。
我的第一次嘗試是使電話看起來像if (i % 500 == 0) System.gc()
,使呼叫每500個記錄發生。我試着提高並降低這個數字,但結果不一致,通常會返回一個OutOfMemory錯誤。
我的第二個,更聰明的嘗試看起來是這樣的:
try {
message = inbox.getMessage(i);
} catch (OutOfMemoryError e) {
if (firstTry) {
i--;
firstTry = false;
} else {
firstTry = true;
System.out.println("Message " + i + " skipped.");
}
System.gc();
continue;
}
的想法是隻調用垃圾收集器如果內存不足的錯誤被拋出,然後再遞減計數再試一次。不幸的是,解析幾千封電子郵件後,該計劃只是開始輸出:
Message 7030 skipped.
Message 7031 skipped.
....
等對他們的休息。
我只是困惑,如何按每個迭代收集器將返回不同的結果比這個。根據我的理解,垃圾是垃圾,所有這些應該改變的是在特定時間收集多少垃圾。
任何人都可以解釋這種奇怪的行爲?有沒有人有其他方式的建議,以更少的頻率調用收集器?我的堆空間最多了。
你試過增加堆空間嗎? –
@VivinPaliath他的堆空間最大是問題的最後一句...... – fvu
@fvu您可以使用'-Xmx'來增加堆空間。除非他的意思是他的機器沒有足夠的內存來做這件事。 –