jvisualvm 是随 JDK 一起发布的一款集成的、多功能的 Java 虚拟机(JVM)监控和故障排查工具,它无需安装,只需在 JDK 的 bin 目录下双击 jvisualvm.exe (Windows) 或运行 ./jvisualvm (Linux/macOS) 即可启动。

核心功能概览
jvisualvm 主要提供以下几大核心功能:
- 监控:实时监控本地或远程应用程序的运行状态,包括:
- 概览:CPU、内存、线程、类的使用情况。
- 监视器:更详细的 CPU、内存、线程、类加载器、编译器性能图表。
- 线程:查看所有线程状态(运行、等待、锁死等),可以检测线程死锁。
- 分析:对应用程序进行深入分析,特别是内存问题:
- 堆栈:查看 JVM 堆的快照,分析对象占用情况,查找内存泄漏。
- 抽样器:进行 CPU 性能分析(方法级耗时)和内存分配分析(对象分配热点)。
- 管理:
- JVM 参数:查看并修改运行中 JVM 的参数。
- MBeans:通过 JMX 查看和管理应用程序的 MBean,实现更深层次的应用监控和管理。
- 插件扩展:支持安装插件,极大地扩展其功能,如:
- Visual GC:以图形化方式实时展示 GC 的详细过程。
- BTrace:动态追踪正在运行的应用程序,无需重启即可执行脚本。
- GCViewer:导入 GC 日志文件进行分析。
如何启动 jvisualvm
启动方式非常简单,前提是你的系统已经安装了 JDK。
启动命令
打开你的终端(Windows 的 CMD 或 PowerShell,Linux/macOS 的 Terminal),然后执行:
# 确保你的 JAVA_HOME 已正确设置,或者直接使用完整路径 # 在 macOS 或 Linux 上: /usr/libexec/java_home -v 1.8.0_321/bin/jvisualvm # 在 Windows 上: C:\Program Files\Java\jdk-1.8.0_321\bin\jvisualvm.exe # 或者,JDK 在环境变量 PATH 中,直接输入: jvisualvm
启动后,你会看到一个简洁的图形界面。

连接目标应用
jvisualvm 可以连接两种目标:
- 本地应用程序:自动列出所有当前正在运行的 Java 进程。
- 远程应用程序:通过 JMX 连接到远程服务器上的 Java 应用。
连接远程应用步骤:
- 在远程服务器的 JVM 启动参数中添加 JMX 监听端口:
-Dcom.sun.management.jmxremote.port=9090 \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port:指定 JMX 服务的端口号。-Dcom.sun.management.jmxremote.authenticate=false:关闭认证(生产环境请务必开启并配置安全)。-Dcom.sun.management.jmxremote.ssl=false:关闭 SSL(生产环境建议开启)。
- 在
jvisualvm的主界面左侧,右键点击 "远程",选择 "添加主机",输入远程服务器的 IP 地址。 - 连接成功后,展开该主机,你就能看到远程服务器上所有开启了 JMX 的 Java 进程,双击即可连接。
主要界面和功能详解
连接到一个应用后,你会看到以下几个主要标签页:
概览
这是最直观的界面,展示了应用的“健康状况”。

- 摘要:应用名称、主类、JVM 版本、启动时间等基本信息。
- 监视器:以实时图表的形式展示 CPU、堆内存、非堆内存、线程数和类加载器数量,这是判断应用是否繁忙或是否存在内存问题的第一道防线。
监视器
这个标签页提供了比“概览”更详细的性能数据图表,让你能更精确地分析性能波动的具体时间点。
内存
这是排查内存问题的核心工具。
- 堆:显示堆内存的使用情况,你可以手动执行 GC 按钮来观察内存是否被回收。
- 堆栈:内存分析的关键,点击 堆栈 按钮,会生成当前堆内存的快照。
- 生成堆栈:快照生成后,
jvisualvm会分析堆中所有对象。 - 查看对象:在 "类" 视图中,你可以按类名(如
java.lang.String,com.yourcompany.YourObject)进行筛选,排序方式通常是 "实例数" 或 "已用总大小"。 - 定位内存泄漏:如果一个类的实例数或总大小异常巨大,并且长时间不被回收,那么它很可能就是内存泄漏的源头,你可以右键点击该类,选择 "查看 -> 查看实例",进一步查看这些对象是由哪些代码(调用栈)创建的。
- 生成堆栈:快照生成后,
线程
排查线程问题和死锁的利器。
- 线程列表:列出所有线程,显示其名称、状态(如
RUNNABLE,WAITING,TIMED_WAITING,BLOCKED)。 - 死锁检测:如果检测到死锁,
jvisualvm会用红色标记出参与死锁的线程,并提供一个简单的分析报告。 - 线程转储:点击 "线程转储" 按钮,可以生成当前所有线程的快照(类似于
jstack命令的输出),这对于分析应用卡在哪个方法上非常有帮助。
抽样器
进行性能分析,找出代码中的瓶颈。
- CPU:
- 点击 "开始" 后,
jvisualvm会定期采样各个方法的调用栈。 - 停止后,你可以看到每个方法被调用的次数和总耗时(或占用 CPU 时间的百分比)。
- 这能帮你快速定位到 CPU 密集型的“热点方法”。
- 点击 "开始" 后,
- 内存分配:
- 点击 "开始" 后,它会记录方法分配对象的次数和大小。
- 这能帮你找到创建大量对象的地方,是导致频繁 GC 的元凶。
MBeans
面向高级用户和开发者。
- 什么是 MBeans:JMX (Java Management Extensions) 的核心,是受管资源(如内存池、线程池、应用自定义的业务指标)的标准化接口。
- 如何使用:你可以浏览和管理所有可用的 MBeans,你可以查看
java.lang类型下的内存池信息,或者查看你自己应用暴露的业务指标(如 QPS、订单数等)。
常用插件推荐
jvisualvm 的强大之处在于其插件生态,点击顶部菜单栏的 "工具" -> "插件",在 "可用插件" 标签页中可以搜索和安装。
- Visual GC:强烈推荐,安装后,在内存标签页下会多出一个 "Visual GC" 子标签页,它会以非常直观的图形化方式展示 Eden 区、Survivor 区、Old 区的使用情况,以及每次 Minor GC 和 Major GC 的过程和时间,对于理解 GC 行为至关重要。
- BTrace:动态调试神器,允许你向正在运行的应用程序注入一段 Java 代码(追踪脚本),来打印日志、方法入参、返回值等,而无需重启应用,对于排查线上偶发性问题非常有用。
- GCViewer:一个用于分析离线 GC 日志文件(如
-Xloggc:gc.log)的工具,安装后,你可以直接将 GC 日志文件拖入jvisualvm中,它会生成可视化的 GC 分析报告,帮助你理解 GC 的效率和频率。
总结与最佳实践
| 场景 | 使用功能 |
|---|---|
| 快速查看应用状态 | 概览:看 CPU、内存是否过高。 |
| 应用卡顿、响应慢 | 线程:检查是否有线程阻塞或死锁,生成 线程转储 分析调用栈。 |
| 内存溢出、频繁 Full GC | 内存 -> 堆栈:分析哪个对象占用了过多内存,定位泄漏源头,安装 Visual GC 查看 GC 过程。 |
| CPU 占用过高 | 抽样器 -> CPU:分析哪个方法是性能热点。 |
| 线上偶发问题 | 安装 BTrace 插件,动态追踪方法调用。 |
| 分析 GC 日志 | 安装 GCViewer 插件,分析离线 GC 日志文件。 |
jvisualvm 是每一位 Java 开发者和运维工程师都应该熟练掌握的“瑞士军刀”,它功能强大、免费且随 JDK 自带,是进行 JVM 性能调优和故障排查的首选工具之一,多动手尝试,你很快会发现它的强大之处。
