我寫了一個需要處理數千個文本文件的Java程序(全部需要在內存中加載)。它可以和多達123個輸入文件一起工作,但是當我運行它來處理大約5000個文件時,它會在路中間意外終止,而不會給出任何錯誤消息/異常。任何人都可以告訴我可能出錯的線索嗎?Java程序意外終止,沒有任何錯誤信息
我在Mac OS Leopard上使用jdk1.6,內存爲2GB。
我寫了一個需要處理數千個文本文件的Java程序(全部需要在內存中加載)。它可以和多達123個輸入文件一起工作,但是當我運行它來處理大約5000個文件時,它會在路中間意外終止,而不會給出任何錯誤消息/異常。任何人都可以告訴我可能出錯的線索嗎?Java程序意外終止,沒有任何錯誤信息
我在Mac OS Leopard上使用jdk1.6,內存爲2GB。
鑑於這是你的計劃,我建議你做到以下幾點:
首先,改變main
方法,使一切都在報告所有捕獲的異常使用try/catch塊完成的;例如這樣的事情:
public static void main(String[] arghhhhh) {
try {
...
} catch (Throwable ex) {
System.err.println("Uncaught exception - " + ex.getMessage());
ex.printStackTrace(System.err);
}
}
其次,尋找你可能「擠壓」意外的異常,抓住他們,而不報告他們。
三,尋找任何你可能會默默地打電話給System.exit()
的地方。這也可能發生在圖書館......如果你使用的是寫得不好的書。
如果這些措施不給你答案,揣摩如何申請是由
你是否同時打開文件?如果您一次加載太多文件,則可能內存不足。如果文件足夠大,則可能只會打開一個文件而導致內存不足。另外,確保在完成文件時關閉文件。
檢查是否有任何try/catch塊沒有正確記錄異常。
它很可能是OutofmemoryError。確保控制檯未被重定向。
控制檯未重定向。 – Fahim 2010-02-03 06:35:29
看來你正在得到OutofmemoryError
。
如果是這種情況,請嘗試增加堆內存大小。
java -Xms<initial heap size> -Xmx<maximum heap size>
主要有兩個原因。
爲了應對這些情況考慮做以下步驟:
確保您處理啓動Java堆棧幀中的所有異常,即主法:
嘗試{ ..code }趕上(的Throwable t)的{ t.printStackTrace }
確保您有在輸出和錯誤指向控制。您可以通過編程方式將它們設置爲具體文件:
System.setOut(new PrintStream(「output.txt」)); System.setErr(new PrintStream(「err.txt」));
如何大是這些文件(在內存佔用)?你有沒有使用任何工具觀察自由記憶? – lexu 2010-02-03 05:56:22
你如何確定沒有生成錯誤消息或異常? – 2010-02-03 07:07:32
嘗試編寫一些日誌並找出程序每次終止的位置,這可以給出關於哪行代碼有問題的任何線索 – 2010-02-03 07:15:32