【问题标题】:Java threads: interpreting thread states of a running JVMJava 线程:解释正在运行的 JVM 的线程状态
【发布时间】:2009-12-01 17:01:48
【问题描述】:

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 状态可以推断出什么? 即“在这种情况下,JVM 看起来正在空闲等待请求”、“机器正忙于处理请求”等。

【问题讨论】:

标签: java performance multithreading stack-trace jstack


【解决方案1】:

这个级别的输出没有提供足够的信息来做出这样的陈述。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多