菜鸟科技网

jvisualvm命令怎么用?

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

jvisualvm命令怎么用?-图1
(图片来源网络,侵删)

核心功能概览

jvisualvm 主要提供以下几大核心功能:

  1. 监控:实时监控本地或远程应用程序的运行状态,包括:
    • 概览:CPU、内存、线程、类的使用情况。
    • 监视器:更详细的 CPU、内存、线程、类加载器、编译器性能图表。
    • 线程:查看所有线程状态(运行、等待、锁死等),可以检测线程死锁。
  2. 分析:对应用程序进行深入分析,特别是内存问题:
    • 堆栈:查看 JVM 堆的快照,分析对象占用情况,查找内存泄漏。
    • 抽样器:进行 CPU 性能分析(方法级耗时)和内存分配分析(对象分配热点)。
  3. 管理
    • JVM 参数:查看并修改运行中 JVM 的参数。
    • MBeans:通过 JMX 查看和管理应用程序的 MBean,实现更深层次的应用监控和管理。
  4. 插件扩展:支持安装插件,极大地扩展其功能,如:
    • 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命令怎么用?-图2
(图片来源网络,侵删)

连接目标应用

jvisualvm 可以连接两种目标:

  • 本地应用程序:自动列出所有当前正在运行的 Java 进程。
  • 远程应用程序:通过 JMX 连接到远程服务器上的 Java 应用。

连接远程应用步骤:

  1. 在远程服务器的 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(生产环境建议开启)。
  2. jvisualvm 的主界面左侧,右键点击 "远程",选择 "添加主机",输入远程服务器的 IP 地址。
  3. 连接成功后,展开该主机,你就能看到远程服务器上所有开启了 JMX 的 Java 进程,双击即可连接。

主要界面和功能详解

连接到一个应用后,你会看到以下几个主要标签页:

概览

这是最直观的界面,展示了应用的“健康状况”。

jvisualvm命令怎么用?-图3
(图片来源网络,侵删)
  • 摘要:应用名称、主类、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 性能调优和故障排查的首选工具之一,多动手尝试,你很快会发现它的强大之处。

分享:
扫描分享到社交APP
上一篇
下一篇