Java线程:解释正在运行的JVM的线程状态

Java线程始终处于以下十种状态之一:

NEW: Just starting up, ie, 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个已IN_NATIVE ,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看起来正在等待请求”,“机器正在忙于处理请求”等。

此级别的输出无法提供足够的信息来生成此类语句。

举个例子,考虑BLOCKED状态:有很多东西可以导致线程被阻塞。 其中两个正在等待来自客户端的数据,并等待数据从数据库返回。 在第一种情况下,您的应用程序处于空闲状态,而第二种情况则是超载。

编辑:没看过jstack的输出,我想这两个条件也可以表示为IN_NATIVE。 但是,同样的评论认为:你不知道他们在做什么,所以你不能对整个应用程序做任何陈述。

kdgregory是正确的,线程状态不一定会显示你想要的东西。 但是,jstack还应该为您提供堆栈跟踪,让您可以准确地看到程序中线程的位置(假设它没有被混淆或者某些东西)。 例如,一个BLOCKED线程的跟踪包含对InputStream.read()的调用,应该是相当明显的。

我会说一下在查看线程状态时的一般情况,或者一般情况下分析数据是为了能够问自己“我是否预计会出现这种情况?” 如果你对你得到的数据是坏/好/预期/意外没有意见,那么就很难做到这一点。

对于线程状态,我认为查看单个线程的行为更有趣,然后问自己“我是否期望该线程处于该状态/等待该锁定的时间相当长?” 只知道给定的线程本身被阻塞/等待等并不是那么有趣,因为知道它被阻止/等待的是什么。