У меня есть приложение Java, которое загадочно умирает без каких-либо исключений в журналах. Я бегу в фоновом режиме через bash script, который оборачивает поЬир, как показано ниже:Java-приложение умирает тихо, почему?
nohup java -Xms6g -Xmx6g -jar myapp.jar 2>> stderr.txt >> /dev/null & echo $! > /tmp/myapp-pid
приложение Java довольно большой объем памяти и так была настроена с 6GB кучного пространства (работает на 64 битной JVM) , Он работает нормально около 8 часов, а затем бесшумно умирает. Никаких исключений в журналах, ничего.
Из основного метода приложение входит в бесконечный цикл while, опросы AWS SQS для сообщений и обрабатывает их. Это все завернуто в try-catch, и я регистрируюся в catch. Похоже, что приложение завершает работу после завершения цикла while, когда он регистрирует последнюю строку. например Приложение всегда будет заканчиваться «Успешно обработанным».
while(true) {
try {
// Logic to poll SQS and process the message
} catch (MyCustomException e) {
// Write to SQS dead letter queue (was throwing at this point)
// Delete message from original SQS
} catch (Throwable e) {
LOG.error(...);
} finally {
LOG.info("Processing time was...");
}
}
Я не уверен, с чего начать, поскольку я бы подумал, что он что-то зарегистрирует. Может ли кто-нибудь указать некоторые указатели или некоторые настройки JVM для настройки, чтобы я мог начать расследование?
Мне интересно, могут ли быть причиной ошибки вне кода. Как, возможно, сбой JVM?
Обновление Похоже, что это действительно была ошибка программирования. Я не думал, что это вызвало проблему, поэтому я не добавил ее к указанному выше пути кода (просто добавил ее сейчас), но у меня было другое предложение catch, которое вылавливало пользовательское исключение, которое я создал. Внутри этого улова я пытался переместить сообщение SQS в очередь мертвых букв, но у меня не было разрешения на это, и, таким образом, он выбрасывал внутри улова, который я не обрабатывал.
Спасибо за все, что помогло в определении того, что, возможно, пошло не так!
Ваш логгер настроен для регистрации уровня ERROR - не только INFO? – tbsalling
Два вопроса: у вас есть журнал, где начинается «пока»? Любой другой шаблон, отличный от 8 часов, которые вы упомянули? – skw
Из структуры вашего цикла, я предполагаю, что у вас есть хотя бы одна команда 'break;' где-то внутри цикла ... В этом случае используйте редактор для поиска и замены команды 'break;' (s) с чем-то вроде System.out.println («Breakng out of loop!»); break; ', чтобы подтвердить, что вы выходите из цикла через один из этих разрывов или нет; и если да, то приступайте к расследованию того, какой разрыв прерывается и почему. --- Или добавьте контрольные точки в каждую команду 'break;' и используйте профайлер для их отладки. – XenoRo