Java, программа завершает работу без сообщения об ошибке
Я написал java-программу, которая должна обрабатывать тысячи текстовых файлов (все они должны быть загружены в память). Он прекрасно работает со всеми 123 входными файлами, но когда я запускаю его для обработки около 5000 файлов, он неожиданно завершается посреди дороги, не давая никакого сообщения об ошибке/исключения. Может ли кто-нибудь подсказать мне, что могло пойти не так?
Я использую jdk1. 6 на Mac OS Leopard, имеющей 2 ГБ оперативной памяти.
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. Убедитесь,что консоль не перенаправлена.
Есть в основном две причины.
- произошла" необработанная " системная ошибка, т. е. java.яз..OutOfMemoryError.
- произошла" необработанная " ошибка приложения.
- Система.выход был вызван.
Чтобы справиться с этими сценариями, выполните следующие действия:
- Ищите в своем коде вызовы к системе.выход.
Убедитесь, что вы обрабатываете все исключения в начальном фрейме стека Java, т. е. Main-метод:
Попробуйте{ ..код }catch (Throwable t){ Т.печатные }
Убедитесь, что вы контролируете направление stdout и stderr. Вы можете программно установить их в конкретные файлы:
Система.setOut (new PrintStream ("выход.формат txt")); Система.setErr (new PrintStream ("err.txt"));
- Начните с args как: - Xloggc: gc.log-XX:+PrintGCDetails-XX:+PrintGCTimeStamps