Как найти бесконечный цикл в веб-приложении Java?

Однажды наше веб-приложение Java достигает 100% использования ЦП. Перезапуск решил инцидент, но не проблему, потому что через несколько часов проблема вернулась. Мы подозревали бесконечный цикл, появившийся в новой версии, но мы не вносили никаких изменений в код или на сервер.

Нам удалось найти проблему, сделав несколько дампов потоков с помощью команды kill -QUIT, а также просмотрев и сравнив детали каждого потока. Мы обнаружили, что один стек вызовов потока появляется во всех дампах потоков. После анализа было условие цикла while, которое никогда не становится ложным для некоторых данных, которые регулярно обновлялись в базе данных.

Анализ нескольких дампов потоков веб-приложения действительно утомителен.

Итак, знаете ли вы какой-либо лучший способ или инструменты для поиска такой проблемы в производственной среде?


person Franck    schedule 04.05.2011    source источник
comment
возможный дубликат редкий бесконечный цикл в коде, не хочется ждать, пока он повторится   -  person Joachim Sauer    schedule 04.05.2011
comment
Редко можно найти точную копию такого конкретного вопроса ;-)   -  person Joachim Sauer    schedule 04.05.2011
comment
Я не думаю, что это обман, тем более что его самостоятельный ответ нашел программное обеспечение для мониторинга, которое ему помогает.   -  person John Saunders    schedule 08.05.2011


Ответы (3)


После некоторых запросов я нашел ответ в разделе Мониторинг и управление платформой Java SE 6. Приложения :

Вы можете диагностировать циклический поток с помощью предоставленного JDK инструмента под названием JTop, который покажет время ЦП, используемое каждым потоком: введите описание изображения  здесь

По имени потока вы можете найти трассировку стека этого потока на вкладке «Потоки», создав дамп потока с помощью команды kill -QUIT.

Теперь вы можете сосредоточиться на коде, вызывающем бесконечный цикл.

PS. Кажется, можно ответить на мой собственный вопрос в соответствии с https://blog.stackoverflow.com/2008/07/stack-overflow-private-beta-begins/ : […] «да, это нормально, и даже поощряется отвечать на ваши собственные вопросы, если вы найдете хороший ответ раньше всех». […]

PS.: В случае, если домен sun.com больше не существует: вы можете запустить JTop как автономный графический интерфейс:

$ <JDK>/bin/java -jar <JDK>/demo/management/JTop/JTop.jar

Кроме того, вы можете запустить его как подключаемый модуль JConsole:

$ <JDK>/bin/jconsole -pluginpath <JDK>/demo/management/JTop/JTop.jar 
person Franck    schedule 06.05.2011

Решите проблему до того, как она возникнет! Используйте инструмент статического анализа, например FindBugs или PMD как часть вашей системы сборки. Он не найдет все, но это хороший первый шаг.

person David Grant    schedule 04.05.2011
comment
См. также en.wikipedia.org/wiki/Halting_problem, чтобы узнать, почему вы не всегда можете определить, программа выйдет. - person philwb; 04.05.2011
comment
FYI FindBugs и PMD ничего не нашли. - person Franck; 06.05.2011

Подумайте об использовании инструментов покрытия, таких как Cobertura. Это показало бы вам, что вы не тестировали эти кодовые пути.

Тестирование как это может стать очень громоздким, поэтому постарайтесь избежать этого, введя измерения качества.

В любом случае такие инструменты, как VisualVM, дадут вам хороший обзор всех потоков, поэтому становится относительно легко идентифицировать потоки, которые работают в течение неожиданно долгого времени.

person ffray    schedule 04.05.2011
comment
Покрытия кода недостаточно. Даже если у нас есть 100% покрытие кода, это зависит от значения строкового аргумента. См. ibm.com/developerworks/java/library/j-cq01316. - person Franck; 04.05.2011
comment
Не буду прямолинейным, но я мог бы возразить, что ваших тестов тогда было недостаточно. Это не столько критика ваших методов тестирования, сколько предложение использовать подобные обстоятельства для их улучшения. Вы только что узнали, что предыдущее предположение было ложным. Теперь вам нужны тесты, которые выявляют условия этого предположения. - person Mike Yockey; 04.05.2011
comment
@yock: ты отвечаешь Фрэнку? Если да, то я не вижу связи. Да, хорошие тесты могли бы обнаружить бесконечные циклы. Но 100-процентное покрытие тестами не обязательно означает хорошие тесты, и, таким образом, чистое покрытие кода не является допустимым способом измерения качества тестирования. Есть что-то, что мне не хватает? - person Joachim Sauer; 04.05.2011
comment
Я отвечал Франку, да. Покрытие кода само по себе не слишком полезно для чего-либо, кроме убеждения руководства в том, что вы производите что-то. - person Mike Yockey; 04.05.2011
comment
Покрытие является только показателем измерения. Но этого достаточно, чтобы сказать вам, какие части вашего кода были протестированы, а какие нет. Если бы вы протестировали это, не было бы необходимости в каких-либо инструментах покрытия, а также в проверке бесконечных циклов в производстве :-) - person ffray; 04.05.2011
comment
Я отредактировал вопрос, чтобы сосредоточиться на решении проблемы в производственной среде. Методы профилактики хороши, но не всегда достаточны. - person Franck; 04.05.2011