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 http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstack.html)在不同的时间点:
- 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 整体状态的什么信息?IE。 “在这种情况下,JVM 看起来正在空闲等待请求”、“机器正忙于处理请求”等。
此级别的输出无法提供足够的信息来做出此类陈述。
举个例子,考虑 BLOCKED 状态:有很多事情可能导致线程被阻塞。其中两个正在等待来自客户端的数据,并等待数据从数据库返回。在第一种情况下,您的应用程序处于空闲状态,在第二种情况下,您的应用程序过载。
编辑:没有查看 jstack 的输出,我想这两个条件也可以表示为 IN_NATIVE。然而,同样的评论也成立:您不知道他们在做什么,因此您无法对整个应用程序做出任何陈述。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)