当前位置: 首页 > news >正文

JConsole 监控线程池状态

JConsole 可以用来监控 Java 线程池(ThreadPoolExecutor)的状态,包括线程数量、任务执行情况、CPU 及内存使用情况等。下面是具体的操作步骤:

一、启动 JConsole

1. 启动 JConsole

  • Windows:在 JDK bin 目录下找到 jconsole.exe,双击运行。
  • Linux/macOS:在终端输入 jconsole 启动。

2. 选择 Java 进程

  • 启动 Java 应用后,在 JConsole 的进程列表中选择你的 Java 进程,点击 “连接”

二、监控线程池状态

JConsole 提供多个选项卡,可以帮助监控线程池状态。

1. 在 “线程” (Threads) 选项卡

(1)查看线程池的线程

  • 线程池的线程通常以 pool-x-thread-y 命名,例如:
    pool-1-thread-1
    pool-1-thread-2
    
  • 你可以找到这些线程并观察其状态:
    • RUNNABLE:线程正在执行任务,说明线程池繁忙。
    • WAITING / TIMED_WAITING:线程在等待任务,可能是 corePoolSize 过大或任务不足。
    • BLOCKED:线程可能因锁竞争而阻塞。

(2)查看线程堆栈

  • 选中某个线程,点击 “堆栈跟踪”(Thread Stack Trace),可以看到该线程当前在执行的代码,帮助排查线程卡住的原因。

2. 在 “内存” (Memory) 选项卡

  • 查看线程占用的内存:如果线程池创建了大量线程,占用了过多的堆空间,可能需要调整 maximumPoolSize 或使用 allowCoreThreadTimeOut(true) 让空闲线程自动销毁。
  • 检查 Full GC 频率:如果频繁触发 Full GC,可能是线程占用的资源过多导致的。

3. 在 “MBeans” (管理 Bean) 选项卡

(1)打开 java.lang:type=Threading

  • 这里可以看到所有线程的状态,包括 线程数守护线程数峰值线程数总线程创建数 等信息。

(2)监控 ThreadPoolExecutor 相关信息

  • JConsole 可以通过 JMX 访问 ThreadPoolExecutor 的属性。
  • MBeans 选项卡中,找到 java.util.concurrent.ThreadPoolExecutor 相关的 MBean,关注以下参数:
    • PoolSize:当前线程池中的线程数
    • ActiveCount:正在执行任务的线程数
    • CompletedTaskCount:已完成的任务数
    • TaskCount:总任务数
    • QueueSize:任务队列大小
    • RejectedExecutionCount:被拒绝的任务数(当任务队列满时)

三、开启 JMX 远程监控

如果你的应用运行在服务器上,JConsole 也可以进行远程监控。

步骤 1:修改应用启动参数,开启 JMX 远程监控

在远程服务器上,启动 Java 应用时添加 JVM 选项:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

解释:

  • -Dcom.sun.management.jmxremote:开启 JMX 远程管理。
  • -Dcom.sun.management.jmxremote.port=9010:指定 JMX 监听的端口(可以更换成其他未占用的端口)。
  • -Dcom.sun.management.jmxremote.ssl=false:禁用 SSL(默认启用,但这里为了方便调试关闭)。
  • -Dcom.sun.management.jmxremote.authenticate=false:禁用 JMX 认证(默认启用,为了方便调试关闭,生产环境建议开启认证)。

🔹 如果是 Spring Boot 应用,可以在 application.properties 配置:

management.endpoint.jmx.enabled=true
management.endpoints.jmx.exposure.include=*

步骤 2:确保远程服务器防火墙允许 JMX 端口

JMX 远程连接使用的是 TCP 端口,需要在远程服务器上开放对应的端口:

sudo firewall-cmd --zone=public --add-port=9010/tcp --permanent
sudo firewall-cmd --reload

或者使用 iptables

iptables -A INPUT -p tcp --dport 9010 -j ACCEPT
service iptables save

步骤 3:本地使用 JConsole 连接远程服务器

  1. 本地 电脑上打开 JConsole
    jconsole
    
  2. 选择 远程进程,在输入框输入:
    远程服务器IP:9010
    
    例如:
    192.168.1.100:9010
    
  3. 点击 “连接”,进入监控界面,查看 线程、内存、MBeans 等信息

可选步骤:使用 SSH 端口转发(避免开放 JMX 端口)

如果你不想直接暴露 JMX 端口,可以使用 SSH 端口转发:

ssh -L 9010:localhost:9010 user@远程服务器IP

然后在 JConsole 里连接:

localhost:9010

这样,你的 JMX 连接是通过 SSH 隧道加密的,更加安全。

✅ 远程监控步骤:

  1. 启动应用时开启 JMX 远程管理(添加 -Dcom.sun.management.jmxremote 相关参数)。
  2. 确保服务器防火墙开放 JMX 端口(或使用 SSH 端口转发)。
  3. 本地使用 JConsole 连接远程 JVM,即可实时监控线程池和其他 JVM 状态。

如果是 生产环境,建议开启 JMX 认证和 SSL,防止未经授权的访问:

-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.ssl=true

这样就可以安全高效地 远程监控 Java 线程池的运行状态 了!🚀

四、结合 Prometheus + Grafana 监控

JConsole 适用于临时监控,如果需要长期监控线程池状态,可以结合 Prometheus 和 Grafana:

  1. 在应用中暴露 JMX 监控指标(Spring Boot 可使用 micrometer)。
  2. Prometheus 采集数据
  3. Grafana 配置仪表盘,实时查看线程池状态。

总结

JConsole 可以帮助监控 Java 线程池状态,关键步骤:

  1. 在 “线程” 选项卡查看线程池线程状态
  2. 在 “内存” 选项卡监控线程的内存占用
  3. 在 “MBeans” 选项卡查看 ThreadPoolExecutor 关键参数
  4. 支持远程 JMX 监控,适用于服务器端应用

这样,你可以轻松分析线程池的运行状态,调整最优的参数配置!🚀

相关文章:

  • 基恩士PLC编程小技巧十:快速查找空软元件
  • 生态质量研究概述
  • Linux命令基础,创建,输入,输出,查看,查询
  • Cadence学习笔记4
  • (C语言)指针数组的运用
  • 【打卡D6】二分法
  • 【PyQt5】【Visual Studio】环境配置
  • 【MySQL数据库】约束
  • Audacity 技术浅析(一)
  • C# Exe + Web 自动化 (BitComet 绿灯 自动化配置、设置)
  • 什么是强哈希算法pbkdf2(Password-Based Key Derivation Function)
  • 算法题(98):大数加法
  • Python桌面应用开发入门:Tkinter+PyQt5实战文件管理器教程
  • 2024华东师范大学计算机复试上机真题
  • Androidstudio实现一个app引导页(超详细)
  • 【电路笔记】-多谐振荡器
  • 2024年12月CCF-GESP编程能力等级认证C++编程六级真题解析
  • Java常用设计模式
  • maven笔记
  • 电子学会—2024年06月青少年软件编程(图形化)二级等级考试真题——绘制图形
  • 来论|以法治之力激发民营经济新动能
  • 第1现场|俄媒称乌克兰网上出售北约对乌军培训手册
  • 王毅同丹麦外交大臣拉斯穆森会谈
  • 上海小学生暑(寒)托班会增设开办期数、延长办班时间吗?团市委回应
  • 发射后失联,印度地球观测卫星发射任务宣告失败
  • 体坛联播|水晶宫队史首夺足总杯,CBA总决赛爆发赛后冲突