有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在尝试更多地了解java线程转储。 我正在使用JBOSS EAP 4.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)

我想从上面理解。是什么导致CPU利用率上升的


共 (1) 个答案

  1. # 1 楼答案

    有6种不同的线程状态:

    1. 新的
    2. 等待
    3. 定时等待
    4. 可运行的
    5. 阻止
    6. 终止

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

    捕获线程转储以及输出将帮助您识别导致CPU峰值的线程。这里有一个good article指导您如何解决CPU峰值问题