java - top -H 显示了几个没有出现在 jstack 输出中的线程 ID

标签 java performance centos jstack

我正在尝试调查为什么我的 jboss 占用 600% CPU(在 CentOS 5 上运行)。

我运行 top -H 并尝试将结果与 jstack 输出进行比较。大多数来自 top 的线程 ID 都出现在 jstack 的输出中,但不幸的是,占用大部分 CPU 的线程并未在此处列出。

由于输出很长,我在这里只列出了一部分。

$top -b -n1 -H -p <jboss pid>

top - 08:04:58 up 73 days, 19:50,  1 user,  load average: 5.72, 5.97, 5.95
Tasks: 128 total,   6 running, 122 sleeping,   0 stopped,   0 zombie
Cpu(s): 63.6%us,  1.7%sy,  0.0%ni, 34.2%id,  0.3%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:  32946160k total, 32545228k used,   400932k free,    86776k buffers
Swap: 34996216k total,      136k used, 34996080k free, 21577176k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                          
12908 jboss     16   0 9488m 8.6g  18m S 71.5 27.4 146:45.68 java                                                                                                                             
12903 jboss     16   0 9488m 8.6g  18m S 69.5 27.4 146:36.08 java                                                                                                                             
12904 jboss     16   0 9488m 8.6g  18m S 69.5 27.4 146:39.63 java                                                                                                                             
12905 jboss     16   0 9488m 8.6g  18m S 69.5 27.4 146:44.46 java                                                                                                                             
12906 jboss     16   0 9488m 8.6g  18m S 69.5 27.4 146:53.94 java                                                                                                                             
12907 jboss     16   0 9488m 8.6g  18m S 69.5 27.4 146:39.18 java                                                                                                                             
12914 jboss     16   0 9488m 8.6g  18m R 27.8 27.4  36:26.64 java                                                                                                                             
12901 jboss     25   0 9488m 8.6g  18m S  0.0 27.4   0:00.00 java                                                                                                                             
12902 jboss     25   0 9488m 8.6g  18m S  0.0 27.4   0:00.05 java                                                                                                                             
12909 jboss     23   0 9488m 8.6g  18m S  0.0 27.4  76:34.09 java                                                                                                                             
12910 jboss     23   0 9488m 8.6g  18m S  0.0 27.4  76:33.49 java                                                                                                                             
12911 jboss     15   0 9488m 8.6g  18m S  0.0 27.4 257:10.35 java                                                                                                                             
12915 jboss     15   0 9488m 8.6g  18m S  0.0 27.4   0:06.63 java                                                                                                                             
12916 jboss     15   0 9488m 8.6g  18m S  0.0 27.4   0:19.61 java  
more lines.... 

jstack输出如下

# /usr/java/jdk1.6.0_33/bin/jstack -F 3362

Deadlock Detection:

No deadlocks found.

Thread 13055: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
 - java.lang.Object.wait() @bci=2, line=485 (Interpreted frame)
 - org.apache.tomcat.util.net.JIoEndpoint$Worker.await() @bci=8, line=415 (Interpreted frame)
 - org.apache.tomcat.util.net.JIoEndpoint$Worker.run() @bci=11, line=441 (Interpreted frame)
 - java.lang.Thread.run() @bci=11, line=662 (Interpreted frame)


Thread 12996: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
 - java.lang.Object.wait() @bci=2, line=485 (Interpreted frame)
 - org.apache.tomcat.util.net.JIoEndpoint$Worker.await() @bci=8, line=415 (Interpreted frame)
 - org.apache.tomcat.util.net.JIoEndpoint$Worker.run() @bci=11, line=441 (Interpreted frame)
 - java.lang.Thread.run() @bci=11, line=662 (Interpreted frame)


Thread 12994: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
 - java.lang.Object.wait() @bci=2, line=485 (Interpreted frame)
 - org.apache.tomcat.util.net.JIoEndpoint$Worker.await() @bci=8, line=415 (Interpreted frame)
 - org.apache.tomcat.util.net.JIoEndpoint$Worker.run() @bci=11, line=441 (Interpreted frame)
 - java.lang.Thread.run() @bci=11, line=662 (Interpreted frame)

更多堆栈....

jstack 输出中的线程 ID 也出现在 top 的输出中,但是来自 top 的线程 ID 是 CPU 最密集的 (1903-1908) 没有出现在 jstack 的输出中。

我认为这些可能是 GC 线程,但我找不到任何证据来证明这一点。

知道为什么我看不到 jstack 中的所有线程,或者我可以做些什么来查看丢失的线程?

最佳答案

尝试在 jboss 所有者下运行 jstack。这样您将获得更多线程作为输出。通过发行

jstack -l 12345

我得到了

 "Service Thread" #9 daemon prio=9 os_prio=0 tid=0x00007f976c0d3000 nid=0x1f56a runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

注意 nid 是从 top -H 得到的线程 id 的十六进制表示

关于java - top -H 显示了几个没有出现在 jstack 输出中的线程 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16866361/

相关文章:

java - 具有方法访问检测的 Python 抽象属性

java - 构造期间的线程安全

ios - SceneKit - 向场景添加新的 SCNNode 会导致严重滞后

linux - 我该如何解决此消息 : "Cannot retrieve repository metadata (repomd.xml) for repository: CentALT. Please verify its path and try again"?

java - 在 Sling 中映射过滤器和 servlet

java - 基于 Spring Batch Java 的配置 Autowiring 不起作用

node.js - 从远程PC进行nodejs tcp测试

linux - 如何在 CentOS Linux 中将我的 python 版本更改为 3.5.2?

.net - 枚举 BitArray 会导致大量装箱/拆箱吗?

c++ - 实现一个高效的容器来存储图中的边