JBoss 线程 - JMX 与 Java Visual VM - 报告不同的结果 - 为啥?

Posted

技术标签:

【中文标题】JBoss 线程 - JMX 与 Java Visual VM - 报告不同的结果 - 为啥?【英文标题】:JBoss Threads - JMX vs Java Visual VM - reporting different results - Why?JBoss 线程 - JMX 与 Java Visual VM - 报告不同的结果 - 为什么? 【发布时间】:2012-03-30 12:03:13 【问题描述】:

当我使用 Java VisualVM 监控我的 JBoss 应用程序时。 它显示 活动线程为:155 守护线程为:135

当我使用 JBoss 的 JMX Web 控制台时。 它显示 当前繁忙线程为:40 当前线程数为:60

为什么 Java Visual VM 报告的内容与 JMX Web 控制台显示的内容之间存在如此大的差异。 (Live Threads 和 Busy Threads 有什么不同)

【问题讨论】:

【参考方案1】:

活动线程是存在但不是Terminated 的线程。 (见Thread.State) 繁忙的线程是实际工作的线程,或者更准确地说是Runnable。

JBoss 的 Web 控制台倾向于报告较少的线程,因为它非常非侵入性。换句话说,它不必仅仅为了呈现一个网页而产生额外的线程。它已经在运行一个 Web 服务器,并且在您进入 JMX 控制台之前它已经分配了线程来处理 Web 请求。

另一方面,Visual VM 启动多个线程来支持 JMX 远程处理(通常是 RMI),这会带来一些额外的负担。您可能会看到额外的线程,例如:

RMI TCP Connection(867)
RMI TCP Connection(868)
RMI TCP Connection(869)
JMX server connection timeout

话虽如此,但您报告的差异有点不合时宜,让我认为您查看的不是同一个 JVM。

JMX 控制台很明显 :),所以我猜您的 Visual VM 连接到其他地方。查看是否可以关联相似的线程名称(使用 MBean jboss.system:type=ServerInfo listThreadDump 操作),或者浏览 Visual VM 中的 MBean 并检查 JBoss MBean。这些 mbean 值得一看,因为它们表示绑定到套接字,因此如果它们不是同一个 JVM 进程,它们就不能具有相同的值:

jboss.web:name=HttpRequest1,type=RequestProcessor,worker=http-0.0.0.0-18080

当然,另一件事是,如果你先启动 VisualVM,让它运行,然后转到 JMX 控制台,但没有看到那么多线程,那么你肯定是在不同的 VM 中。

干杯。

//尼古拉斯

【讨论】:

以上是关于JBoss 线程 - JMX 与 Java Visual VM - 报告不同的结果 - 为啥?的主要内容,如果未能解决你的问题,请参考以下文章

无法将 Jvisual Vm 与 Jboss EAP 6.1 集成

利用VisualVm和JMX远程监控Java进程

JBOSS安全配置

如何使用 Prometheus jmx-exporter 监控 JBoss EAP

修改jmx远程监控wildfly/jboss配置,然后通过jdk自带的visualvm工具来进行性能监控

Apache Tomcat/Jboss远程代码执行漏洞 怎样解决