繁体   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