java - 为什么我的 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)
我不知道这个线程是什么以及我的应用程序的哪个部分创建了它。
解决方案
听起来您没有关闭打开的连接,导致等待超时。
最佳做法是在获得结果后立即显式关闭所有连接。
请注意,如果您try
/ catch
-ing 异常等并且没有做很多代码来关闭连接,则可能无法到达关闭连接的代码,因此请最后检查是否有任何打开并在方法结束时适当关闭或连接打开时您处于何种控制结构。
推荐阅读
- google-apps-script - 按 ID 将指定值从 CSV 导入 Google 工作表
- wordpress - 如何在 WooCommerce 中定义基于支付网关的每个产品的自定义价格?
- jupyter-notebook - AWS Sagemaker 笔记本间歇性“无法找到凭证”
- html - 使用引导程序 4 时字体机器人不起作用
- javascript - Npm publish 给出了无效的目录
- mongodb - MongoDB 查询以查找同时拥有 SELL 和 PURCHASE 的客户列表
- msbuild - nuget restore 未在 AWS CodeBuild windows 默认映像中创建 xml 文件
- python - TypeError:使用 MTCNN 时,元组索引必须是整数或切片,而不是 str
- python - Wagtail(Django) ModelAdmin 按钮视图操作
- typescript - 将 typescript 升级到 4.2.x,导入路径不能以“.ts”结尾?