
JVisualVM可以用来监控Java 线程池ThreadPoolExecutor的状态包括线程数、CPU 使用率、任务执行情况等。具体步骤如下打开 JVisualVMJDK 8 及以下JVisualVM 自带可以直接在 JDK 的bin目录下找到jvisualvm.exe并运行。JDK 9 及以上需要单独下载安装https://visualvm.github.io/连接目标 Java 应用启动 Java 应用确保 JMX 远程管理开启。在 JVisualVM 左侧的「本地」或「远程」列表中找到 Java 进程并双击连接。在 “监视” (Monitor) 选项卡CPU 使用率观察 CPU 利用率是否因线程池配置不当导致资源浪费或不足。堆内存使用监控线程创建时的内存消耗避免 OOM。线程活动查看活跃线程数量是否线程数接近maximumPoolSize。在 “线程” (Threads) 选项卡查找线程池的工作线程在Threads选项卡可以看到所有线程的状态如RUNNABLE、WAITING、BLOCKED。线程池的线程通常会以pool-x-thread-y形式命名可以找到它们的运行状态。检查线程状态RUNNABLE线程正在执行任务表明线程池有足够的任务。WAITING / TIMED_WAITING线程空闲可能corePoolSize设置过高或任务不足。BLOCKED可能多个线程争用资源如数据库连接、锁竞争。观察线程栈点击某个线程可以查看其调用栈分析是否有任务执行时间过长或死锁。使用 “Sampler” 进行分析在Sampler选项卡选择CPU 采样CPU Sample查看线程池中的线程 CPU 消耗情况判断是否 CPU 过载。选择内存采样Memory Sample查看线程占用的对象避免泄漏。使用 MBeans 监控线程池参数JVisualVM 支持JMXJava Management Extensions可以通过MBeans选项卡直接监控ThreadPoolExecutor的相关属性打开 MBeans 选项卡找到java.util.concurrent.ThreadPoolExecutor相关的 MBean关注以下属性PoolSize当前线程池中线程数ActiveCount正在执行任务的线程数CompletedTaskCount已完成的任务数TaskCount总任务数QueueSize任务队列大小RejectedExecutionCount被拒绝的任务数如果有如果应用部署在服务器上可以开启 JMX 远程监控让 JVisualVM 连接远程 JVM在远程服务器启动 Java 应用时添加 JVM 选项-Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.port9010-Dcom.sun.management.jmxremote.sslfalse-Dcom.sun.management.jmxremote.authenticatefalse-Dcom.sun.management.jmxremote启用 JMX 远程管理。-Dcom.sun.management.jmxremote.port9010指定 JMX 监听端口可以修改。-Dcom.sun.management.jmxremote.sslfalse禁用 SSL默认启用这里为了方便关闭。-Dcom.sun.management.jmxremote.authenticatefalse禁用 JMX 认证默认启用生产环境建议开启。⚠️ 生产环境建议开启认证和 SSL防止未经授权访问-Dcom.sun.management.jmxremote.authenticatetrue-Dcom.sun.management.jmxremote.ssltrue如果服务器启用了防火墙需要开放 JMX 端口例如 9010sudofirewall-cmd--zonepublic --add-port9010/tcp--permanentsudofirewall-cmd--reload或使用iptablesiptables-AINPUT-ptcp--dport9010-jACCEPTserviceiptables save本地使用 JVisualVM 连接远程 JVM启动 JVisualVMjvisualvm添加远程主机在“应用”Applications面板中右键“远程”Remote→“添加远程主机”Add Remote Host。输入远程服务器 IP点击确定。添加 JMX 连接在远程主机下右键“添加 JMX 连接”Add JMX Connection。输入远程服务器IP:9010取消“Use SSL”如果之前未启用 SSL。点击确定。开始监控连接成功后可以看到远程 JVM 进程点击进程即可查看线程Threads查看线程池中的线程状态CPU、内存使用情况堆转储、垃圾回收MBeans可监控ThreadPoolExecutor关键参数如果不想直接暴露 JMX 端口可以使用SSH 端口转发ssh-L9010:localhost:9010 user远程服务器IP然后在JVisualVM里连接localhost:9010这样JMX 连接是通过SSH 隧道进行加密的更加安全。JVisualVM 比 JConsole 更强大可以提供更多 JVM 运行时指标、内存分析和垃圾回收日志适用于更深入的性能优化分析如果需要长期监控线程池状态可以结合Micrometer Prometheus Grafana使用ThreadPoolExecutor的getPoolSize()、getActiveCount()、getQueue().size()进行指标采集。通过 Prometheus 拉取数据并在 Grafana 中可视化线程池的状态。