2009-12-01 2 views
4

ява нити всегда находится в одном из следующих десяти государств:Java тема: интерпретируя нить состояния работают JVM

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? I.e. «в этом сценарии JVM выглядит бездействующим ожиданием запросов», «машина занята обработкой запросов» и т. д.

+0

привет, где вы находите приведенное выше описание состояний нитей? – StrikeW

+0

Состояние потоков и их описания можно найти в классе JavaThreadState [HotSpot JVM] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b27/sun/jvm /hotspot/runtime/JavaThreadState.java). – kernelthree

ответ

4

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

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

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

1

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

1

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

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