8

我编写了一个需要处理数千个文本文件的 java 程序(所有文件都需要加载到内存中)。它可以很好地处理多达 123 个输入文件,但是当我运行它来处理大约 5000 个文件时,它会在路中间意外终止,而不会给出任何错误消息/异常。谁能告诉我可能出了什么问题?

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

4

5 回答 5

4

鉴于这是您的程序,我建议您执行以下操作:

首先,更改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()默默呼叫的任何地方。这也可能发生在图书馆中……如果您使用的是写得不好的图书馆。

如果这些措施没有给你答案,试着弄清楚应用程序是如何退出的

  • 通过在关键点设置断点的调试器运行,或
  • 通过在关键点添加跟踪打印语句。
于 2010-02-03T06:10:59.567 回答
3

好像你得到了OutofmemoryError.

如果是这种情况,请尝试增加堆内存大小。

java -Xms<initial heap size> -Xmx<maximum heap size>
于 2010-02-03T06:05:20.107 回答
2

您是否同时打开文件?如果一次加载太多文件,则可能内存不足。如果文件足够大,您可能会因为只打开一个文件而耗尽内存。此外,请确保在完成文件后关闭它们。

于 2010-02-03T05:56:03.657 回答
1

检查您是否有任何未正确记录异常的 try/catch 块。

它很可能是 OutofmemoryError。确保控制台没有被重定向。

于 2010-02-03T05:57:42.173 回答
1

主要有两个原因。

  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
于 2017-02-07T11:57:50.960 回答