簡體   English   中英

Java程序意外終止,沒有任何錯誤消息

[英]Java program terminates unexpectedly without any error message

我編寫了一個需要處理數千個文本文件的java程序(都需要加載到內存中)。 它可以使用多達123個輸入文件,但是當我運行它來處理大約5000個文件時,它會在路中間意外終止,而不會給出任何錯誤消息/異常。 誰能給我一些可能出錯的線索?

我在具有2GB RAM的Mac OS Leopard上使用jdk1.6。

鑒於它是您的程序,我建議您執行以下操作:

首先,更改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()任何地方。 這也可能發生在圖書館......如果你使用的是寫得不好的。

如果這些措施沒有給你答案,試着弄清楚應用程序是如何退出的

  • 通過從在關鍵點設置斷點的調試器運行,或
  • 通過在關鍵點添加跟蹤打印語句。

看起來你正在OutofmemoryError

如果是這種情況嘗試增加堆內存大小。

java -Xms<initial heap size> -Xmx<maximum heap size>

你是否同時打開文件? 如果一次加載太多文件,則可能內存不足。 如果文件足夠大,則可能只有一個文件打開時內存不足。 此外,確保在完成文件后關閉文件。

檢查是否有任何未正確記錄異常的try / catch塊。

它很可能是OutofmemoryError。 確保未重定向控制台。

主要有兩個原因。

  1. 發生了“未處理”的系統故障,即java.lang.OutOfMemoryError。
  2. 發生了“未處理”的應用程序故障。
  3. System.exit已被調用。

要處理這些情況,請考慮執行以下步驟:

  • 查看代碼以獲取對System.exit的調用。
  • 確保處理起始Java堆棧框架中的所有異常,即Main-method:

    嘗試{..code} catch(Throwable t){t.printStackTrace}

  • 確保您可以控制stdout和stderr所在的位置。 您可以以編程方式將這些設置為具體文件:

System.setOut(new PrintStream(“output.txt”)); System.setErr(new PrintStream(“err.txt”));

  • 以args開頭:-Xloggc:gc.log -XX:+ PrintGCDetails -XX:+ PrintGCTimeStamps

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM