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

时间:2009-12-01 17:01:48

标签: 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_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 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状态可以推断什么? I.e。 “在这种情况下,JVM看起来正在等待请求”,“机器正忙着处理请求”等等。

3 个答案:

答案 0 :(得分:4)

此级别的输出无法提供足够的信息来发表此类声明。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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