У меня есть java-приложение, которое загадочным образом умирает без каких-либо исключений в журналах. Я запускаю его в фоновом режиме через скрипт bash, который оборачивает nohup, как показано ниже:
nohup java -Xms6g -Xmx6g -jar myapp.jar 2>> stderr.txt >> /dev/null & echo $! > /tmp/myapp-pid
Java-приложение довольно интенсивно использует память, поэтому было настроено с 6 ГБ пространства кучи (работает на 64-битной JVM). Он работает нормально около 8 часов, а затем молча умирает. Никаких исключений в логах, ничего.
Из основного метода приложение входит в бесконечный цикл while, опрашивает AWS SQS на наличие сообщений и обрабатывает их. Все это завернуто в try-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 в очередь недоставленных сообщений, но не имел на это разрешения и, таким образом, бросал внутри улов, который я не обрабатывал.
Спасибо всем тем, кто помог предположить, что могло пойти не так!
break;
где-то внутри цикла... В этом случае используйте редактор для поиска и замены ваших командbreak;
чем-то вродеSystem.out.println("Breakng out of loop!");break;
, чтобы подтвердите, выходите ли вы из цикла через один из этих разрывов или нет; и если да, приступайте к расследованию того, какой перерыв срабатывает неправильно и почему. --- Или добавьте точки останова в каждую командуbreak;
и используйте профилировщик для их отладки. - person XenoRo   schedule 03.11.2015