如何正确分析java线程转储?

时间:2016-01-20 08:04:54

标签: thread-dump

我想了解更多有关java线程转储的信息。 我正在使用JBOSS EAP 4.3。

目前我在我的某个环境中面临性能问题。 突然CPU利用率上升到700%。我接受了线程转储,这是一个巨大的文件。

我在threaddump中找到了很多等待线程条目。

" HTTP-172.16.101.99-8080-4"守护进程prio = 10 tid = 0x0000000059d16800 nid = 0x5803 in Object.wait()[0x00002b00cf683000]    java.lang.Thread.State:WAITING(在对象监视器上)     at java.lang.Object.wait(Native Method)      - 等待< 0x000000070c1eef60> (a org.apache.tomcat.util.net.JIoEndpoint $ Worker)     在java.lang.Object.wait(Object.java:485)     在org.apache.tomcat.util.net.JIoEndpoint $ Worker.await(JIoEndpoint.java:416)      - 已锁定< 0x000000070c1eef60> (a org.apache.tomcat.util.net.JIoEndpoint $ Worker)     在org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:442)     在java.lang.Thread.run(Thread.java:662)

我想从上面的等待线程中理解。导致CPU利用率上升的原因是什么?

1 个答案:

答案 0 :(得分:0)

有6种不同的线程状态:

  1. NEW
  2. 等待
  3. TIMED_WAITING
  4. RUNNABLE
  5. 已封锁
  6. 已终止

NEW,WAITING,TIMED_WAITING,BLOCKED,TERMINATED状态线程消耗CPU。仅处于RUNNABLE状态的线程会消耗CPU。因此,如果应用程序的CPU加速运行,则应仅关注RUNNABLE状态线程堆栈跟踪。

捕获线程转储以及'top -H -p 输出将帮助您识别导致CPU峰值的线程。这里是good article,它引导您解决如何解决CPU峰值问题。