A Java thread is always in one of the following ten states:
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.
The unused state (UNINITIALIZED
) has been omitted from the list.
While the definitions of the states are given above I'm looking for "rule-of-thumbs" for interpreting a given thread state setup for a running appserver. And, more specifically:
Assume a live application server with the following thread statistics (obtained using jstack) at various points in time:
- 100 threads: 35
BLOCKED
, 65IN_NATIVE
- 113 threads: 35
BLOCKED
, 77IN_NATIVE
, 1IN_VM
- 52 threads: 38
BLOCKED
, 1IN_JAVA
, 6IN_NATIVE
, 7IN_VM
- 120 threads: 39
BLOCKED
, 1IN_JAVA
, 80IN_NATIVE
- 94 threads: 34
BLOCKED
, 59IN_NATIVE
, 1IN_NATIVE_TRANS
For each thread of the five statistics - what can be inferred with regards to the overall JVM state? I.e. "in this scenario the JVM looks to be idling waiting for requests", "the machine is busy processing requests", etc.