当前位置: 首页 > 知识库问答 >
问题:

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

徐昆
2023-03-14

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

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

我在我的threaddump中发现了很多下面等待的线程条目。

"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个答案

吴和硕
2023-03-14

有6种不同的线程状态:


  1. 等待
  2. TIMED_WAITING
  3. 运行N ABLE
  4. 阻塞
  5. 终止

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

捕获线程转储以及“top-H-p”输出将帮助您识别导致CPU峰值的线程。这是一篇很好的文章,介绍了如何解决CPU峰值问题。

 类似资料:
  • 问题内容: 我试图了解有关Java的更多信息,尤其是有关内存管理和线程的信息。因此,我最近发现对线程转储感兴趣。 以下是使用VisualVM(适用于Java的内置工具)从Web应用程序摘录的几行内容: 首先,我对一些变量名称有疑问: tid和nid是什么意思? Object.wait之后方括号中的数字是多少? 然后对于堆栈跟踪本身: 这是什么意思 等待 <.....>(一java.lang中...

  • 但这一个也不起作用。正确的答案是加入线程并删除2个睡眠: 我的问题是:为什么我的答案都不能被接受?我的实验室领导问,但他不能给我一个答案。在家里编写了测试代码,它似乎工作得很好。提前感谢您的帮助!

  • 问题内容: 我需要一个解决方案来正确停止Java中的线程。 我有实现Runnable接口的类: 我有启动和停止线程的类: 但是当我关闭时,我在类中得到了异常: 我正在使用JDK 1.6。所以问题是: 如何停止线程并且不引发任何异常? PS我不想使用;方法,因为它已过时。 问题答案: 在类中,你需要一种设置标志的方法,该标志通知线程它将需要终止,类似于你刚刚在类范围中使用的变量。 当你希望停止线程时

  • 尝试在多线程环境中的条件帐户之间进行转移,我的方法有多真实,我错在哪里? 按照计划,我在主线程中创建了一个新的线程,在这个新线程中初始化了一个类型为Transfer的新类,然后我从数据库中获取了2个帐户的数据,我随机确定了要随机传输的数量。我翻译并将更改写回数据库。账户中所有资金的总和必须保持正确。也就是说,如果我们有50个账户,每个账户1000元(总共50000元),那么在所有交易之后,应该不会

  • 问题内容: 我有用于在Java中创建线程的此类 控制台显示以下文本作为输出 我的代码创建了新线程: 我的问题是:为什么返回正确的线程名却返回另一个? 问题答案: 为什么要返回正确的线程名称而又返回其他? 您的课程,但随后您通过调用以下内容开始: 这是不正确的。这意味着创建的线程实际是 不 一样的。 应该实现而 不是 扩展线程。您的代码可以工作,因为线程也是可运行的。 因为有两个线程对象,所以当您调

  • 问题内容: 您如何从正在运行的JBoss实例生成和分析线程转储? 问题答案: 有一个特定于JBoss的方法,它更加用户友好: http://community.jboss.org/wiki/GenerateAThreadDumpWithTheJMXConsole 当您没有直接访问主机的权限(这需要“杀死”)时,这特别有用。