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个已阻止,65个IN_NATIVE
> 113个线程:35个阻塞,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看起来正在等待请求”,“机器正忙于处理请求”等.
解决方法:
此级别的输出无法提供足够的信息来进行此类陈述.
举个例子,考虑一下BLOCKED状态:有很多东西可以导致线程被阻塞.其中两个正在等待来自客户端的数据,并等待数据从数据库返回.在第一种情况下,您的应用程序处于空闲状态,而第二种情况则是超载.
编辑:没有看过jstack的输出,我想这两个条件也可以表示为IN_NATIVE.但是,同样的评论认为:你不知道他们在做什么,所以你不能对整个应用程序做任何陈述.