Java, программа завершает работу без сообщения об ошибке


Я написал java-программу, которая должна обрабатывать тысячи текстовых файлов (все они должны быть загружены в память). Он прекрасно работает со всеми 123 входными файлами, но когда я запускаю его для обработки около 5000 файлов, он неожиданно завершается посреди дороги, не давая никакого сообщения об ошибке/исключения. Может ли кто-нибудь подсказать мне, что могло пойти не так?

Я использую jdk1. 6 на Mac OS Leopard, имеющей 2 ГБ оперативной памяти.

5 8

5 ответов:

Учитывая, что это ваша программа, Я предлагаю вам сделать следующее:

Во-первых, измените метод 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.яз..OutOfMemoryError.
  2. произошла" необработанная " ошибка приложения.
  3. Система.выход был вызван.

Чтобы справиться с этими сценариями, выполните следующие действия:

  • Ищите в своем коде вызовы к системе.выход.
  • Убедитесь, что вы обрабатываете все исключения в начальном фрейме стека Java, т. е. Main-метод:

    Попробуйте{ ..код }catch (Throwable t){ Т.печатные }

  • Убедитесь, что вы контролируете направление stdout и stderr. Вы можете программно установить их в конкретные файлы:

Система.setOut (new PrintStream ("выход.формат txt")); Система.setErr (new PrintStream ("err.txt"));

  • Начните с args как: - Xloggc: gc.log-XX:+PrintGCDetails-XX:+PrintGCTimeStamps