jconsole 与 jvisualvm:图形化看 JVM
更新时间:2026-09-20。命令行的 jstack/jstat/jcmd 适合服务器与脚本,本机开发或有图形环境时,jconsole/VisualVM 能更直观地看趋势。命令行对照见 jstack、jcmd,生产无图形界面推荐 Arthas。
一、两者怎么分工
| 工具 | 定位 | 强项 |
|---|---|---|
jconsole | JDK 自带、较朴素的 JMX 客户端 | 堆/线程/类加载实时曲线、手动 GC、浏览与操作 MBean |
jvisualvm / VisualVM | 更强大的可视化工具(旧版随 JDK 自带) | CPU/内存抽样器、heap dump 获取与分析、线程时间线、插件扩展 |
bash
jconsole # 弹出本地 JVM 列表,选一个连
jvisualvm # 老版本 JDK(≤8/部分发行版)自带二、jconsole 能看什么
- 内存(Memory):堆与各代(Eden/Old/Metaspace)随时间曲线,老年代只涨不回是泄漏的直观信号;
- 线程(Threads):每线程状态时间线,点进去看栈,底部有「检测到死锁」按钮;
- 类(Classes):已加载类数量,持续上涨要怀疑类加载泄漏;
- MBean:浏览注册的 JMX Bean,可读写属性、执行操作(很多框架与连接池暴露指标和管理动作在这)。
三、VisualVM 强在哪
- 抽样器(Sampler):低开销采样 CPU/内存,快速定位最耗 CPU 的方法、最多的对象(不像 profiler 那样插桩、对生产较友好,但仍是抽样不是精确计数);
- 堆转储:一键 heap dump 并在 GUI 里按类、实例、GC Root 引用链浏览;
- 线程时间线:把运行/等待/锁等待画成泳道,死锁与锁竞争一眼可见;
- 插件可加 Visual GC(看各代 GC 动画)、JFR 读取等。
四、本地 vs 远程连接
- 本地:直接列出同用户的 HotSpot 进程,走 attach,无需配置。
- 远程:目标 JVM 要开 JMX。最小化(仅内网测试,无鉴权):
bash
java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar app.jar生产环境必须开 authenticate + ssl/TLS,并配合 java.rmi.server.hostname 指定可达 IP,否则 RMI 回填内网地址导致连不上;端口还要过防火墙(JMX 可能额外开一个 RMI 数据端口)。容器/K8s 里远程 JMX 很麻烦,更推荐 port-forward 或直接进容器用命令行/Arthas。
五、版本变化与替代路线(重要)
- Oracle JDK 9+ 起,
jvisualvm不再随 JDK 分发,需单独下载开源版 VisualVM(visualvm.github.io)。 - 更现代的组合是 JDK Mission Control(JMC)+ JFR(Java Flight Recorder):JFR 是内置、极低开销、可长期在生产开的事件记录器,用 JMC 离线分析,适合生产环境;
- 服务器无图形界面、又想交互式在线诊断,用 Arthas;纯数据看趋势用 jstat 与 GC 日志。
总结
jconsole 是轻量 JMX 图形客户端,擅长看堆与各代曲线、线程状态、类加载数和浏览/操作 MBean;VisualVM 更强,能做 CPU/内存抽样、获取分析 heap dump 和线程时间线,但 Oracle JDK9+ 已不再自带需单独下载;本地连接零配置走 attach,远程必须开 JMX 且生产务必启用鉴权与 TLS、配好 java.rmi.server.hostname 和防火墙端口;生产无图形界面优先用「JMC+JFR」低开销录制离线分析,或用 Arthas 在线诊断,jstat/GC 日志看宏观趋势。