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

Java线程:解释正在运行的JVM的线程状态,java,performance,multithreading,stack-trace,jstack,Java,Performance,Multithreading,Stack Trace,Jstack,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_V

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.
未使用状态(
未初始化
)已从列表中忽略

虽然上面给出了状态的定义,但我正在寻找“拇指规则”来解释正在运行的appserver的给定线程状态设置。更具体地说:

假设一个实时应用程序服务器在不同时间点具有以下线程统计信息(使用获取):

  • 100个线程:35个
    阻塞
    ,65个
    本地线程
  • 113个线程:35个
    被阻止
    ,77个
    在本机中
    ,1个
    在虚拟机中
  • 52个线程:38个
    被阻止
    ,1个
    在JAVA中
    ,6个
    在本机中
    ,7个
    在虚拟机中
  • 120个线程:39个
    被阻止
    ,1个
    在JAVA中
    ,80个
    在本机中
  • 94个线程:34个
    阻塞
    ,59个
    本地线程
    ,1个
    本地线程

对于五个统计数据中的每一个线程,可以推断出关于整个JVM状态的哪些信息?也就是说,“在这种情况下,JVM看起来在空闲等待请求”,“机器正忙于处理请求”,等等。

这种级别的输出没有提供足够的信息来做出这样的声明

作为一个例子,考虑阻塞状态:有很多事情会导致线程被阻塞。其中两个在等待来自客户机的数据,另一个在等待来自数据库的数据。在第一种情况下,应用程序处于空闲状态,而在第二种情况下,应用程序处于过载状态


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

kdgregory是正确的,线程状态本身不一定会揭示你想要的东西。然而,jstack还应该提供堆栈跟踪,让您准确地看到线程在程序中的位置(假设它没有被混淆或其他东西)。例如,跟踪中包含对InputStream.read()调用的阻塞线程应该是相当明显的。

我想说,在查看线程状态或分析数据时,通常有意思的是能够问自己“我是否预期会出现这种情况?”如果你对你得到的数据是否是坏的/好的/预期的/意外的没有意见,那么很难对此做很多事情


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

hi,你在哪里找到了上面的线程状态描述?线程状态及其描述可以在中找到。