Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何正确分析java线程转储?_Java_Thread Dump - Fatal编程技术网

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

如何正确分析java线程转储?,java,thread-dump,Java,Thread Dump,我试图了解更多关于java线程转储的信息。 我正在使用JBossEAP4.3 目前,我在我的一个环境中面临性能问题。 突然,CPU利用率上升到700%。我把线程转储,它是一个巨大的文件 我在我的线程转储中发现了很多下面正在等待的线程条目 "http-172.16.101.99-8080-4" daemon prio=10 tid=0x0000000059d16800 nid=0x5803 in Object.wait() [0x00002b00cf683000] java.lang.Thr

我试图了解更多关于java线程转储的信息。 我正在使用JBossEAP4.3

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

我在我的线程转储中发现了很多下面正在等待的线程条目

"http-172.16.101.99-8080-4" daemon prio=10 tid=0x0000000059d16800 nid=0x5803 in Object.wait() [0x00002b00cf683000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x000000070c1eef60> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
    at java.lang.Object.wait(Object.java:485)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:416)
    - locked <0x000000070c1eef60> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:442)
    at java.lang.Thread.run(Thread.java:662)
“http-172.16.101.99-8080-4”守护进程prio=10 tid=0x0000000059d16800 nid=0x5803在Object.wait()中[0x00002b00cf683000]
java.lang.Thread.State:正在等待(在对象监视器上)
在java.lang.Object.wait(本机方法)
-等待(org.apache.tomcat.util.net.JIoEndpoint$Worker)
等待(Object.java:485)
位于org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:416)
-锁定(org.apache.tomcat.util.net.JIoEndpoint$Worker)
位于org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:442)
运行(Thread.java:662)

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

有6种不同的线程状态:

  • 新的
  • 等待
  • 定时等待
  • 可运行的
  • 阻塞
  • 终止
  • 新线程、等待线程、定时线程、阻塞线程、终止状态线程不消耗CPU。只有处于可运行状态的线程才消耗CPU。因此,如果应用程序的CPU正在增加,则应该只关注可运行状态线程堆栈跟踪


    捕获线程转储以及“top-H-p”输出将帮助您识别导致CPU峰值的线程。下面是一个演示如何解决CPU峰值问题的示例

    等待线程不使用CPUlook来运行或可运行线程,而是使用CPUlook来知道哪个对象正在等待。有没有办法找到问题的确切根本原因?您可以看到它正在等待。搜索那个号码,看看谁有锁。