2015-11-03 4 views
0

У меня есть приложение 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 в очередь мертвых букв, но у меня не было разрешения на это, и, таким образом, он выбрасывал внутри улова, который я не обрабатывал.

Спасибо за все, что помогло в определении того, что, возможно, пошло не так!

+1

Ваш логгер настроен для регистрации уровня ERROR - не только INFO? – tbsalling

+1

Два вопроса: у вас есть журнал, где начинается «пока»? Любой другой шаблон, отличный от 8 часов, которые вы упомянули? – skw

+1

Из структуры вашего цикла, я предполагаю, что у вас есть хотя бы одна команда 'break;' где-то внутри цикла ... В этом случае используйте редактор для поиска и замены команды 'break;' (s) с чем-то вроде System.out.println («Breakng out of loop!»); break; ', чтобы подтвердить, что вы выходите из цикла через один из этих разрывов или нет; и если да, то приступайте к расследованию того, какой разрыв прерывается и почему. --- Или добавьте контрольные точки в каждую команду 'break;' и используйте профайлер для их отладки. – XenoRo

ответ

1

Без дополнительного кода трудно сказать, что на самом деле происходит. Но по определению окончательно выполняется всегда, что также означает и в случае отказа. Возможно, вам просто не хватает исключения, которое написано перед ним. Попробуйте переместить вызов finally внутри «try'-block».

while(true) { 
    try { 
     // Logic to poll SQS and process the message 
     LOG.info("Successfully processed"); 
    } catch (Throwable e) { 
     //As mentioned in the comments try for debugging to log on info level here as well. 
     // Maybe error level is disabled (although this should be 
     //very unlikely since error normally is written too when info is written. 
     LOG.info(...); 
    } finally { 
     //Clean up. 
    } 
} 

Это две идеи, которые могут помочь вам в дальнейшем расследовать вашу проблему.

+0

Извините, что журнал был введен в заблуждение. В конечном итоге я не регистрирую сообщение об успешном завершении. Я регистрирую время обработки. Я получаю как уровни регистрации INFO, так и ERROR таким образом, что кажется прекрасным. – n00b

1

У вашей системы не хватает памяти? Попробуйте запустить приложение из сценария обертывания, зарегистрировав код выхода - echo $! >&2.

Также работает dmesg может сказать вам, если убийца oom выбрал применение ypur в качестве жертвы.

Смежные вопросы