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 (бросаемый t){ Т.печатные }
убедитесь, что у вас есть контроль, куда направлены stdout и stderr. Вы можете программно установить их в конкретные файлы: