Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

родовое слово

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

родовое слово

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top