【问题标题】:How to analyze a java thread dump correctly?如何正确分析java线程转储?
【发布时间】:2016-01-20 08:04:54
【问题描述】:

我想了解更多关于 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 使用率上升?

【问题讨论】:

  • 等待线程不使用 CPU
  • 寻找 RUNNING 或 RUNNABLE 线程
  • 如何知道哪个对象在等待。有没有办法找出问题的确切根本原因?
  • 你可以看到它是waiting on &lt;0x000000070c1eef60&gt;。搜索该号码以查看谁锁定了它。

标签: java thread-dump


【解决方案1】:

有 6 种不同的线程状态:


  1. 等待
  2. TIMED_WAITING
  3. 可运行
  4. 已屏蔽
  5. 已终止

NEW、WAITING、TIMED_WAITING、BLOCKED、TERMINATED 状态线程消耗 CPU。只有处于 RUNNABLE 状态的线程才会消耗 CPU。因此,如果您的应用程序的 CPU 正在加速,您应该只关注 RUNNABLE 状态线程堆栈跟踪。

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

【讨论】:

    猜你喜欢
    • 2011-11-27
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多