Автоматически обнаруживать висящие темы - PullRequest
1 голос
/ 06 мая 2009

В настоящее время я ищу способ идентифицировать висячие темы в Java. Кто-нибудь знает, что лучший способ сделать это?

В настоящее время я могу придумать 2 возможных способа сделать это:

  1. Периодический вызов (callback-) метода во всех методах Приложения. Это кажется немного сложным и неприглядным ... Более того, я не контролирую вызов внешних методов ...
  2. Дополнительный поток, который периодически генерирует дампы потока для всех потоков (или, может быть, только для тех, которые следует отслеживать - поскольку я знаю, какой поток я хочу отслеживать) и анализирует результат ("поток все еще находится в той же точке с замками на одних и тех же предметах ", ...). Это может быть немного опасно, поскольку поток может снова (!) Находиться в одной и той же точке ... Кстати - Есть ли простой способ получить дамп потока в Java 1.4 (я не хочу вызывать внешнее приложение). Я думаю, с 1.5 или 1.6 есть способы, чтобы легко сделать это ...

Полагаю, что ни один из этих двух методов не является хорошим решением ... Так вы знаете, как это сделать?

Как я уже говорил: я не хочу использовать какие-либо внешние приложения ...

Ответы [ 6 ]

2 голосов
/ 06 мая 2009

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

У нас есть низкотехнологичный способ определить, где застряли нити.

Мы посылаем несколько сигналов kill -3 в JVM, чтобы сгенерировать несколько дампов потоков, а затем анализируем выходные данные в поисках похожих трасс, указывая проблемный код.

Низкая технология и руководство, но это сработало.

1 голос
/ 06 мая 2009

Вы можете подключиться к запущенному процессу через jconsole или jvisualvm . Оба эти инструмента позволят вам увидеть трассировку стека потока и состояние потоков.

JVisualVM скриншот:

JVisualVM monitoring threads

0 голосов
/ 08 мая 2009

Если у вас есть состояние гонки, то, безусловно, разумно использовать дополнительные ресурсы (т.е. установить JDK и использовать jps и jstack) для решения проблемы ...

Тем не менее, если вы запускаете приложение вне контейнера, вы можете просто запустить приложение из консоли и нажать ctrl + break (Windows), чтобы получить дамп потока. Или убить -3 на * nix.

Но, исходя из ваших ответов в комментариях, похоже, что это, вероятно, работает на каком-то сервере приложений.

Проблема здесь в том, что почти все, что вы делаете, вносит дополнительную неопределенность в ситуацию. Как вы узнаете, что ваш тупиковый монитор сам по себе не отвечает за взаимные блокировки?

Другим вариантом будет введение регистрации системных входов, а затем повторное воспроизведение того, что произошло в системе, на основе этих входов. Если ваш клиент в основном сказал, что он не поможет вам в устранении неполадок, связанных с вашей расой, то вам нужно найти его самостоятельно в своей тестовой среде. Эмуляция условий загрузки сайта клиента - один из способов сделать это.

Но на самом деле, я рекомендую вам поработать с ними, чтобы установить JDK (чтобы вы могли использовать jstack), или какое-либо приложение для мониторинга JRE 1.4 (черт возьми, убедитесь, что их сервер приложений уже не обеспечивает это такие вещи).

0 голосов
/ 06 мая 2009

Вопрос здесь в том, что означает «висящая нить» и в каком контексте.

Находится ли внутри большой J2EE-сервер (который, вероятно, мог бы это выяснить сам) или крошечная Java-программа, где вы порождаете тонны потоков? Если это последнее, рассмотрите возможность одновременного использования утилит в Java 5+, которая позволяет вам контролировать Runnables и Callables.

0 голосов
/ 06 мая 2009

Это просто идея:

Хранить в централизованном (синхронизированном) классе информацию о времени начала потока и ссылку на поток. Например, ConcurrentHashMap (теперь CHM).

Прошло некоторое (консервативное) время, которое вы можете попросить у CHM для этого потока (или любого другого потока, который, как вы подозреваете, может быть повешен), для его времени запуска. Если поток еще жив, вы можете (консервативно) быть уверенным, что он завис.

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

0 голосов
/ 06 мая 2009

Если вы ищете «автоматический» способ. Нет хорошего решения, кроме как проводить больше времени в процессе проектирования. Если у вас есть темы, которые "висят", то они не были закрыты должным образом. Я бы потратил время на то, как контекстуально закрыть их, а не пытаться написать подпрограмму / поток, который ищет устаревшие потоки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...