【问题标题】:Java program terminates unexpectedly without any error messageJava 程序意外终止而没有任何错误消息
【发布时间】:2011-01-12 11:54:35
【问题描述】:

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

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

【问题讨论】:

  • 这些文件有多大(内存占用)?您是否使用任何工具观察到空闲内存?
  • 如何确定没有产生错误信息或异常?
  • 试着写一些日志,找出程序每次终止的地方,这可以提供任何关于哪一行代码有问题的线索

标签: java terminate


【解决方案1】:

主要有两个原因。

  1. 发生了“未处理”系统故障,即 java.lang.OutOfMemoryError。
  2. 出现“未处理”应用程序错误。
  3. System.exit 已被调用。

要处理这些情况,请考虑执行以下步骤:

  • 查看调用 System.exit 的代码。
  • 确保您处理起始 Java 堆栈帧中的所有异常,即 Main-method:

    试试{ ..代码 }catch(可投掷的 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

【讨论】:

    【解决方案2】:

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

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

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

    • 通过在关键点设置断点的调试器运行,或
    • 通过在关键点添加跟踪打印语句。

    【讨论】:

    • 是的,我有 OutOfMemory 错误,它来自按顺序遍历 136600 个节点的树的递归函数。是因为递归吗?我应该尝试通过循环删除递归吗?这可能吗?
    • 我怀疑(文件目录树的)递归导致了这种情况。您需要使用内存分析器来找出正在使用内存的内容。
    • 当我遇到同样的错误,但 try&catch arround main 没有输出任何东西时,我是否有机会看到发生了什么?
    • @reox - 你在抓Throwable吗?
    【解决方案3】:

    您似乎收到了OutofmemoryError

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

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

    【讨论】:

    • 是的,我有 OutOfMemory 错误,它来自按顺序遍历 136600 个节点的树的递归函数。是因为递归吗?我应该尝试通过循环删除递归吗?那可能吗?是的,我可以增加堆大小,我认为这是最后的选择。
    • 如何查看当前堆大小?每次运行程序之前我都必须增加堆大小吗?
    • 你可以使用JDK自带的JConsole工具。
    • 感谢大家,我发现这是内存问题。增加堆大小解决了这个问题。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 大部分文件大小为 4 KB,最大的文件为 193 KB。所有文件的大小总计为 20 MB。我正在一个接一个地阅读这些文件。我看到那些已成功读取。这些文件实际上为我的程序提供了输入。我不对文件做任何更改。我的程序在处理输入的过程中中止。如果堆耗尽,我会期望内存异常。因为,我没有收到任何错误消息,所以我没有任何线索。
      • * 我关闭了所有文件。 * 我还没有使用任何工具观察到可用内存?你能推荐任何工具吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多