Поток 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 ожидает ожидания запросов», «машина занята обработкой запросов» и т. д.