0

我使用 jstack 来获取 CPU 利用率最高的 PID 的线程转储。它指向 nid 为 0x4974 的线程。

“VM 线程”prio=10 tid=0x00007ffc60068800 nid=0x4974 可运行“VM 定期任务线程”prio=10 tid=0x00007ffc60098000 nid=0x497b 等待条件 JNI 全局引用:1182

我在进行分析时遇到问题,因为它没有线程的状态以及正在执行的代码,这与我在网上看到的示例线程转储不同。是否有任何可以分析.txt线程转储文件的最好在线免费软件?

感谢那些回复的人。好的,所以我能够学习如何使用 samurai、tda 和 ibm 线程转储工具。似乎问题在于正在创建的线程数、等待监视器的线程、锁定和阻塞。但我想知道你们是否有额外的投入。这是我从 TDA 得到的:

当它处于 100% cpu 利用率时

Overall Thread Count    1001
Overall Monitor Count   644
Number of threads waiting for a monitor  50
Number of threads locking a monitor 636
Number of threads sleeping on a monitor 0
Number of deadlocks 0
Number of Monitors without locking threads 0

我重置后

Overall Thread Count  32
Overall Monitor Count  13
Number of threads waiting for a monitor  0
Number of threads locking a monitor  13
Number of threads sleeping on a monitor  13
Number of deadlocks 0
Number of Monitors without locking threads 0

40% 的线程在监视器上休眠。

这可能表明他们正在等待一些过载或不可用的外部资源(例如数据库),或者只是在等待做某事(空闲线程)。您应该使用排除所有空闲线程的过滤器检查睡眠线程。

我们只有大约 60 个客户。

我在 cpu 利用率为 100% 且重置后上传了线程转储。I also included the tools that i used (samurai,tda,and ibm thread and monitor dump analyzer) http://www.mediafire.com/?901mduvodm97d8v,x72cdixp8fltabu,fhfw4e50c7fzu4t,1oq2npaxmtxz0dq,i0u997fhvxfagd3,cdewe4de6x3rhe4,w2ndwqw2ekwixkd,qsbst5ow6f59p75,9fx8w8qpfdhjmyx, levpqppb3ouh71q

4

2 回答 2

1

这些内部线程没有 Java 线程堆栈,因此没有任何常规工具可以提供帮助。如果这些消耗过多的 CPU,我首先会怀疑您正在使用的 Java 版本中存在错误。我会尝试使用 Java 6 update 45 或 Java 7 update 45。

要诊断此问题,您需要本机堆栈转储和对 JVM 内部的充分了解。

于 2013-11-04T08:18:44.513 回答
0

转至IBM Thread and Monitor Dump Analyzer for Java从 IBM 下载该工具。但是出于您的目的,您可能能够自己分析线程转储,并将您从 jstack 找到的 ID 映射到线程转储中的线程堆栈跟踪。获取线程转储:

on Linux: kill -3 pid
on Windows: Ctrl-Break (not Ctrl-C)

之后,您可以从命令窗口或标准输出复制线程转储。

于 2013-11-04T06:13:37.977 回答