首页 > 解决方案 > 为什么我的 java 应用程序创建多个名称为“JMX 客户端心跳”的线程会消耗大量 CPU?

问题描述

我有一个从远程系统检索 MBean 的 java 应用程序。但是它消耗了大量的CPU崩溃。当我在消耗大量 CPU 的线程的 PID 上运行 jstack 时,这就是我所看到的:

JMX client heartbeat 148145" #229748 daemon prio=5 os_prio=0 tid=0x00007fe3c2f46800 nid=0x56fc waiting on condition [0x00007fe1d267f000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.sun.jmx.remote.internal.ClientCommunicatorAdmin$Checker.run(ClientCommunicatorAdmin.java:175)
        at java.lang.Thread.run(Thread.java:745)

"JMX client heartbeat 148039" #229615 daemon prio=5 os_prio=0 tid=0x00007fe398317800 nid=0x564a waiting on condition [0x00007fe1d48a1000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.sun.jmx.remote.internal.ClientCommunicatorAdmin$Checker.run(ClientCommunicatorAdmin.java:175)
        at java.lang.Thread.run(Thread.java:745)

"JMX client heartbeat 148036" #229612 daemon prio=5 os_prio=0 tid=0x00007fe3903a4000 nid=0x5647 waiting on condition [0x00007fe1d49a2000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.sun.jmx.remote.internal.ClientCommunicatorAdmin$Checker.run(ClientCommunicatorAdmin.java:175)
        at java.lang.Thread.run(Thread.java:745)

"JMX client heartbeat 147959" #229517 daemon prio=5 os_prio=0 tid=0x00007fe3e09e3000 nid=0x55e7 waiting on condition [0x00007fe1d62bb000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.sun.jmx.remote.internal.ClientCommunicatorAdmin$Checker.run(ClientCommunicatorAdmin.java:175)
        at java.lang.Thread.run(Thread.java:745)

"JMX client heartbeat 147854" #229385 daemon prio=5 os_prio=0 tid=0x00007fe3f551e000 nid=0x5562 waiting on condition [0x00007fe1d83dc000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.sun.jmx.remote.internal.ClientCommunicatorAdmin$Checker.run(ClientCommunicatorAdmin.java:175)
        at java.lang.Thread.run(Thread.java:745)

我不知道这个线程是什么以及我的应用程序的哪个部分创建了它。

标签: java

解决方案


听起来您没有关闭打开的连接,导致等待超时。

最佳做法是在获得结果后立即显式关闭所有连接。

请注意,如果您try/ catch-ing 异常等并且没有做很多代码来关闭连接,则可能无法到达关闭连接的代码,因此请最后检查是否有任何打开并在方法结束时适当关闭或连接打开时您处于何种控制结构。


推荐阅读