Java 线程 : interpreting thread states of a running JVM

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

最佳答案

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

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

编辑:没有查看 jstack 的输出,我想这两个条件也可以表示为 IN_NATIVE。然而,相同的评论仍然存在:您不知道他们在做什么,因此您无法对整个应用程序做出任何陈述。

关于Java 线程 : interpreting thread states of a running JVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1827543/

相关文章:

android - android handlemessage可以重入吗?

java - 当 nextInt 等于 0 时如何终止程序?

java - 无法从 RTSP 服务器获得任何答复

c - 减少 While 循环中的时钟周期计数以提高粒度

具有多个进程的 Linux i2c dev 接口(interface)

c++ - 与 openmp 的 10 维蒙特卡洛集成

java - Sphinx 4可怕的准确性

java - 如何从 ByteBuffer 获取数组,但仅限于它的位置?

python - 添加到 Pandas 的窗口

postgresql - 为什么 PostgreSQL 性能在 VACUUM FULL 之后没有恢复到最大值?