Потоки Java: интерпретация состояний потока работающей JVM - PullRequest
4 голосов
/ 01 декабря 2009

Поток Java всегда находится в одном из следующих десяти состояний:

NEW: Just starting up, i.e., in process of being initialized.
NEW_TRANS: Corresponding transition state (not used, included for completness).
IN_NATIVE: Running in native code.
IN_NATIVE_TRANS: Corresponding transition state.
IN_VM: Running in VM.
IN_VM_TRANS: Corresponding transition state.
IN_JAVA: Running in Java or in stub code.
IN_JAVA_TRANS: Corresponding transition state (not used, included for completness).
BLOCKED: Blocked in vm.
BLOCKED_TRANS: Corresponding transition state.

Неиспользованное состояние (UNINITIALIZED) было исключено из списка.

Хотя определения состояний приведены выше, я ищу «правило» для интерпретации заданной настройки состояния потока для работающего сервера приложений. А конкретнее:

Предположим, что сервер приложений работает со следующей статистикой потоков (полученной с использованием jstack ) в различные моменты времени:

  • 100 потоков: 35 BLOCKED, 65 IN_NATIVE
  • 113 потоков: 35 BLOCKED, 77 IN_NATIVE, 1 IN_VM
  • 52 темы: 38 BLOCKED, 1 IN_JAVA, 6 IN_NATIVE, 7 IN_VM
  • 120 потоков: 39 BLOCKED, 1 IN_JAVA, 80 IN_NATIVE
  • 94 темы: 34 BLOCKED, 59 IN_NATIVE, 1 IN_NATIVE_TRANS

Для каждого потока из пяти статистических данных - что можно сделать в отношении общего состояния JVM? Т.е. «в этом сценарии JVM ожидает ожидания запросов», «машина занята обработкой запросов» и т. д.

Ответы [ 3 ]

4 голосов
/ 01 декабря 2009

Этот уровень вывода не дает достаточно информации, чтобы делать такие заявления.

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

Edit: не глядя на вывод из jstack, я полагаю, что эти два условия также могут быть представлены как IN_NATIVE Тем не менее, тот же комментарий справедлив: вы не знаете, что они делают, поэтому вы не можете делать никаких заявлений о приложении в целом.

1 голос
/ 01 декабря 2009

Я бы сказал, что в целом интересно, когда при взгляде на состояния потоков или даже при профилировании данных можно задавать себе вопрос: "Я ожидал, что это так?" Если у вас нет мнения о том, являются ли получаемые вами данные плохими / хорошими / ожидаемыми / неожиданными, тогда с этим трудно что-либо сделать.

С состояниями потоков, я думаю, что это более интересно посмотреть на поведение отдельных потоков, а затем спросить себя "ожидал ли я, что поток находится в этом состоянии / ждет этой блокировки именно так?" долго?" И просто знать, что данный поток заблокирован / находится в ожидании и так далее, само по себе не так интересно, как знать, ЧТО он был заблокирован / ожидает.

1 голос
/ 01 декабря 2009

kdgregory является верным, что состояние потока не обязательно само покажет, что вы хотите. Однако jstack также должен давать вам трассировки стека, позволяя вам точно определить, где находятся потоки в вашей программе (при условии, что она не запутана или что-то в этом роде). Например, BLOCKED-поток, трассировка которого содержит вызов InputStream.read (), должен быть достаточно очевидным.

...