Как найти бесконечный цикл в веб-приложении Java? - PullRequest
7 голосов
/ 04 мая 2011

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

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

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

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

Ответы [ 3 ]

7 голосов
/ 06 мая 2011

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

Вы можете диагностировать зацикливание потока, используя предоставленный JDK инструмент JTop, который будет отображать процессорвремя использования каждым потоком: enter image description here

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

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

PS .: Кажется, можно ответить на мой собственный вопрос в соответствии с http://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 
3 голосов
/ 04 мая 2011

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

1 голос
/ 04 мая 2011

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

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

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

...