jconsole
jconsole 是 JDK 内置的图形化 JMX 监控工具,无需额外配置即可连接本地或远程 JVM,实时查看堆内存、线程、GC、MBean 等运行状态。
启动
# 直接启动,弹出连接界面
jconsole
# 直接连接指定进程(pid)
jconsole <pid>
# 连接远程 JMX 服务
jconsole host:port
# 禁用 SSL(连接不支持 SSL 的远程 JVM 时使用)
jconsole -J-Djava.net.ssl.trustStore=... host:port远程 JVM 配置
目标 JVM 需在启动时开放 JMX 端口:
java \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9090 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar app.jar生产环境应开启认证(
authenticate=true)并配置jmxremote.password文件,避免未授权访问。
监控面板
| 面板 | 内容 |
|---|---|
| 概览 | CPU 使用率、堆内存、线程数、类加载数实时折线图 |
| 内存 | 各内存区域(Eden、Old、Metaspace 等)使用量,可手动触发 GC |
| 线程 | 所有线程列表、状态、栈帧,支持死锁检测 |
| 类 | 已加载/卸载类数量趋势 |
| VM 概要 | JVM 参数、系统属性 |
| MBean | 浏览和操作所有已注册的 MBean(含自定义 MBean) |
死锁检测
在 线程 面板底部点击 检测死锁,jconsole 会调用 ThreadMXBean.findDeadlockedThreads() 并高亮显示死锁线程链。
命令行等价操作参见 jstack(适合无 GUI 的服务器环境)。
MBean 操作示例
通过 MBean 面板可以:
- 读取/修改 MBean 属性(如动态调整日志级别)
- 调用 MBean 操作(如
gc()、dumpHeap()) - 订阅 MBean 通知
常用内置 MBean:
| MBean | 用途 |
|---|---|
java.lang:type=Memory | 堆/非堆内存使用 |
java.lang:type=Threading | 线程信息与死锁检测 |
java.lang:type=GarbageCollector,name=* | GC 统计 |
java.lang:type=ClassLoading | 类加载统计 |
java.lang:type=Runtime | JVM 启动参数 |
局限性与替代
| 场景 | 建议 |
|---|---|
| 无图形界面的服务器 | 使用 jcmd 命令行替代 |
| 需要线程快照 | 使用 jstack |
| 需要详细 GC 日志分析 | 配置 -Xlog:gc* 结合 GCEasy 等工具 |
| 需要持续性能录制 | 使用 Java Flight Recorder(jfr) |
| 功能更丰富的 GUI | 使用 VisualVM 或 JMC(Java Mission Control) |