JVM 之 visualVM 一
以下是 VisualVM 安装与使用详解,涵盖下载、安装、连接本地/远程 Java 应用、监控、堆转储分析、CPU/内存采样等核心功能,适用于 Java 开发者、运维和性能调优人员。
📌 一、什么是 VisualVM?
VisualVM 是 Oracle 提供的一款免费、可视化 Java 故障诊断与性能分析工具,集成以下功能:
- 实时监控 CPU、内存、线程、类加载
- 生成并分析 堆转储(Heap Dump)
- 进行 CPU 和内存采样(Sampler)
- 查看 线程状态与死锁检测
- 支持 插件扩展(如 MBeans、Buffer Pools)
✅ 优点:轻量、JDK 自带(旧版)、图形化界面
⚠️ 缺点:JDK 11+ 不再默认包含,大堆文件分析能力弱于 MAT
🖥 二、下载与安装
情况 1:你使用的是 JDK 8 ~ JDK 10
- VisualVM 已内置在 JDK 中
- 路径:
$JAVA_HOME/bin/jvisualvm - 直接终端执行即可启动:
jvisualvm
情况 2:你使用的是 JDK 11 及以上版本
- Oracle 从 JDK 11 起移除了 VisualVM
- 需单独下载官方独立版本:
🔗 官方下载地址:
https://visualvm.github.io/download.html
选择对应系统版本:
- Windows:
visualvm_217.zip - macOS:
VisualVM 2.1.7.dmg - Linux:
visualvm_217.tar.gz
💡 当前最新稳定版为 VisualVM 2.1.7(2024 年发布)
安装步骤(以独立版为例)
Windows / Linux:
- 下载 ZIP/TAR 文件
- 解压到任意目录(如
C:\tools\visualvm或/opt/visualvm) - 运行:
- Windows: 双击
bin/visualvm.exe - Linux: 执行
./bin/visualvm
- Windows: 双击
macOS:
- 挂载
.dmg文件 - 将
VisualVM.app拖入Applications文件夹 - 首次运行需在“系统设置 → 隐私与安全性”中允许运行
⚙️ 三、首次启动配置(可选)
1. 增加内存(分析大堆文件需要)
编辑启动脚本:
- Windows:
etc/visualvm.conf - Linux/macOS:
etc/visualvm.conf
取消注释并修改:
# default -J-Xmx256m
visualvm_default_options="-J-Xmx2g"
✅ 建议:分析 2GB 堆文件时设为
-Xmx3g
2. 安装插件(增强功能)
- 启动 VisualVM → Tools → Plugins
- 常用插件:
- Visual GC:查看 GC 分代详情(需应用加
-XX:+UnlockCommercialFeatures) - Buffer Pools:监控 Direct Memory
- MBeans:查看 JMX MBean
- Kill Application:远程终止进程
- Visual GC:查看 GC 分代详情(需应用加
💡 插件安装后需重启 VisualVM
🔍 四、核心功能使用详解
1. 监控本地 Java 应用
- 启动 VisualVM
- 左侧 Applications 面板自动列出所有本地 Java 进程
- 点击进程名,右侧显示:
- Overview:JDK 版本、启动参数、主类
- Monitor:实时 CPU、堆内存、类加载、线程数
- Threads:线程状态(RUNNABLE/BLOCKED/WAITING)、死锁检测
- Sampler:CPU/内存采样
- Profiler(需插件):高级性能剖析
2. 生成并分析堆转储(Heap Dump)
步骤:
- 在 Monitor 标签页点击 Heap Dump 按钮
- 等待几秒(会 STW),生成
.hprof文件 - 自动在左侧 Applications 下新增 Heap Dump 节点
- 双击打开,查看:
- Summary:总实例数、堆大小
- Classes:按类统计对象数量和占用
- Instances:选中类后查看具体对象(支持字段值查看)
- OQL Console:执行对象查询(类似 MAT)
⚠️ 注意:VisualVM 的堆分析功能较弱,建议导出
.hprof后用 Eclipse MAT 深度分析
3. CPU / 内存采样(Sampler)
CPU 采样:
- 切换到 Sampler 标签
- 点击 CPU → 开始采样
- 显示方法调用耗时、调用次数
- 适合定位热点方法
内存采样:
- 点击 Memory → 开始采样
- 显示对象分配速率(Allocations)
- 可识别频繁创建的对象(如临时字符串)
💡 采样 vs Profiling:
- Sampler:低开销,适合生产环境
- Profiler:高精度但高开销,适合测试环境
4. 连接远程 Java 应用
方式 1:通过 JMX(推荐)
步骤 1:目标 Java 应用启用 JMX
启动参数添加:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=服务器公网IP
⚠️ 生产环境应开启认证(
authenticate=true)和 SSL
步骤 2:VisualVM 添加远程主机
- 右键 Remote → Add Remote Host
- 输入服务器 IP
- 右键该主机 → Add JMX Connection
- 输入
9999(端口),勾选 Do not require SSL - 点击 OK,即可监控远程应用
方式 2:通过 jstatd(较少用)
适用于无法修改启动参数的场景,略复杂,此处不展开。
5. 线程分析与死锁检测
- 切换到 Threads 标签
- 点击 Thread Dump 获取当前线程快照
- 若存在死锁,VisualVM 会 高亮显示 “Deadlock detected!”
- 可查看每个线程的堆栈、锁持有情况
🛠 五、实用技巧
技巧 1:保存快照用于后续分析
- 右键应用 → Save Application Snapshot
- 生成
.npss文件,可离线打开
技巧 2:比较两个堆转储
- 生成两次 Heap Dump
- 右键其中一个 → Compare with...
- 查看对象增减变化
技巧 3:过滤无用进程
- Tools → Options → General
- 勾选 Hide well known processes(隐藏 VisualVM 自身等)
⚠️ 六、局限性与替代方案
| 场景 | VisualVM 表现 | 推荐替代 |
|---|---|---|
| 分析 >2GB 堆文件 | 卡顿、崩溃 | ✅ Eclipse MAT |
| 精细 GC 分析 | 功能有限 | ✅ GCViewer + GC 日志 |
| 生产环境长期监控 | 不适合 | ✅ Prometheus + JMX Exporter + Grafana |
| 方法级性能剖析 | 采样精度低 | ✅ Async-Profiler / JProfiler |
✅ 七、总结:VisualVM 使用口诀
本地监控一键连,
远程 JMX 配参数,
Heap Dump 快生成,
Sampler 定位热点准,
大堆分析交 MAT。
📚 学习资源
- 官网:https://visualvm.github.io/
- 用户指南:https://visualvm.github.io/guides.html
- 插件中心:https://visualvm.github.io/plugins.html
本文来自博客园,作者:蓝迷梦,转载请注明原文链接:https://www.cnblogs.com/hewei-blogs/articles/19449113

浙公网安备 33010602011771号