【问题标题】:how to identify the thread which is causing JVM CPU utilization is reaching to 90 to 100% in Jboss java application?如何识别导致 JVM CPU 利用率在 Jboss java 应用程序中达到 90% 到 100% 的线程?
【发布时间】:2026-02-04 06:15:02
【问题描述】:

我们的 java 应用程序(ear)部署在 J Boss+Linux 中,我们正在使用 mod 集群,总共有 8 个 JVM 或 j Boss 实例。

我们可以看到每天一两个JV M的CPU利用率都达到了100%,做app很慢。

我试图通过使用 j 堆栈和 kill Linux 命令来识别导致线程的线程转储。但不幸的是,如果这些命令的 CPU 利用率达到 60% 以上,则 JVM 没有响应。

是否有任何最简单的方法来识别导致问题增加 CPU 利用率的线程/方法/类名称?

谁能尽快提供解决方案?

【问题讨论】:

    标签: java linux jboss cpu-usage mod-cluster


    【解决方案1】:

    要从挂起的进程中获取堆栈,请使用jstack -F <PID>,请参阅oracle docs

    其他解决办法可以找here

    【讨论】:

    • jstack: 目标进程没有响应线程 13700: (state = BLOCKED) - java.lang.Thread.sleep(long) @bci=0(编译帧;信息可能不精确) - org.jboss .console.plugins.AOPLister$RefreshPoller.run() @bci=41, line=898 (Interpreted frame) Thread 13699: (state = BLOCKED) - java.lang.Thread.sleep(long) @bci=0 (Compiled frame ; 信息可能不精确) - org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run() @bci=22, line=1590 (Interpreted frame) - java.lang.Thread.run() @bci=11, li
    • 您好,如果我使用 Jstack -F ,我会得到如上所述的线程转储。如何识别导致问题的线程?
    • 我可以看到大多数答案是用 Sun 替换 openJDK。但我们无法在生产中进行更改。您能否请任何最佳选择如何获取线程转储并确定实际导致问题的线程?
    • 我会创建一些线程转储并比较它们,通常你可以看到一个模式来识别导致线程的。你会在等待和套接字读取等中看到很多线程,它们不是问题。导致这种情况的线程可能会有更长的调用堆栈。
    • 能否请您告知如何识别导致问题的线程以及如何在线程转储中搜索?
    【解决方案2】:

    正如您所写,JVM 没有响应,因此无法获取有关已执行类/方法的详细信息。 因此,“有没有最简单的方法”的答案将是“否”。 ;-)

    但也许它可以帮助您或其他任何人(2.5 年前提出的问题)在这种情况下我会做什么:

    1. 识别 linux 线程(我为此使用了小型 linux 工具“threadcpu”)。
    2. 对找到的 PID 进行 strace - 可能使用更长的字符串(“-s 1024”)。

    这可以提示您当前执行的是哪个类/方法。如果你看到例如数百个 SQL 查询仅在一个类中使用,那么这对您有很大帮助。

    “threadcpu”可以从这里下载:tuxad.com

    【讨论】: