13.2 VisualVM
JVisualVM(经常称为 VisualVM)是个图形化工具,基于 Netbeans 平台开发。这个工具用于监控 JVM,其实相当于聚合了 13.1 节介绍的多个工具,并提供图形化界面。
JVisualVM 是早期 Java 版本中常用的
jconsole工具的替代品。JVisualVM 的兼容性很好,jconsole已经过时,所以还在使用jconsole的安装应该换用 JVisualVM。
VisualVM 在 Java 6 中引入,包含在 Java 分发包中。不过,一般来说,单机版 VisualVM 更新,是重要场合更好的选择。VisualVM 的最新版可从 http://visualvm.java.net/ 下载。
下载后,确保 VisualVM 的二进制文件在 PATH 中,否则,调用的是 JRE 中集成的版本。
首次运行 VisualVM 时,它会调整你的设备,所以要确保调整的过程中没有运行其他应用。调整结束后,VisualVM 会打开一个如图 13-1 所示的界面。

图 13-1:VisualVM 的欢迎界面
把 VisualVM 附属到运行中的进程上有不同的方式,各种方式之间稍有不同,这取决于进程运行在本地还是远程设备中。
本地进程在界面的左边列出。双击某个进程后,会在右面板中出现一个新标签页。
若想查看远程进程,要输入主机名和标签页中显示的名称。默认连接的端口是 1099,不过也可以改成其他端口。
为了能连接上远程进程,远程主机中必须运行着 jstatd(详情参见 13.1 节对 jstatd 的介绍)。如果连接的是应用服务器,服务器中可能已经内置了与 jstatd 等同的功能,因此无需再运行 jstatd。
“Overview”(概述)标签页(如图 13-2)中显示的是 Java 进程的概要信息,包含传入的命令行标志和系统属性,以及使用的 Java 版本。

图 13-2:“Overview”(概述)标签页
“Monitor”(监视)标签页(如图 13-3)中显示的是 JVM 系统活动部分的图表和数据。这些其实是 JVM 的高层遥测数据,包括 CPU 使用情况,以及垃圾回收用掉了多少 CPU。

图 13-3:“Monitor”(监视)标签页
这个标签页中还显示了一些其他信息,包括加载和卸载的类数量、基本的堆内存信息,以及运行中的线程数量。
在这个标签页中也能让 JVM 生成堆转储文件,或者执行完整的垃圾回收过程——不过,在一般的生产环境中,都不推荐做这两个操作。
图 13-4 是“Threads”(线程)标签页,显示 JVM 中运行中的线程相关的数据。这些数据在连续的时间线中显示,可以查看单个线程的详情,还能执行线程转储操作,做进一步分析。

图 13-4:“Threads”(线程)标签页
这个标签页中的信息类似于 jstack 工具得到的信息,不过在这里更方便诊断死锁和线程饥饿。注意,在这里可以清楚地看出同步锁(即操作系统的监视器)和用户空间中的 java.util.concurrent 锁对象之间的区别。
在操作系统监视器实现的锁(即同步块)上竞争的线程放入 BLOCKED 状态,在 VisualVM 中使用红色表示。
锁定的
java.util.concurrent锁对象把线程放入 WAITING 状态(在 Visual VM 中使用黄色表示)。这是因为java.util.concurrent实现的锁完全在用户空间中,不涉及操作系统。
“Sampler”(抽样器)标签页,如图 13-5 所示,抽样分析内存或 CPU。在内存模式中,抽样分析的是对象的创建——可以分析整个过程,也可以分析在 JVM 中的过程,甚至能分析在单个线程中的创建过程。

图 13-5:“Sampler”(抽样器)标签页
开发者在这个标签页中能看出哪些对象是最常用的——包括对象占用的空间字节数和实例数(类似于 jmap -histo)。
Metaspace 模式中显示的对象往往是 Java/JVM 核心结构。4 我们通常需要深入分析系统的其他部分,例如类加载,才能看到负责创建这些对象的代码。
4在 Java 8 之前,Metaspace 叫 PermGen。
JVisualVM 提供了插件系统,下载并安装额外的插件就能扩展这个框架的功能。我们推荐一定要安装 MBeans 插件(如图 13-6)和 VisualGC 插件(下面会介绍,如图 13-7)。为了兼容以前的 Java 版本,通常还会安装 JConsole 插件。

图 13-6:MBeans 插件

图 13-7:VisualGC 插件
在 MBeans 标签页中可以与 Java 管理服务(尤其是 MBeans)交互。JMX 能很好地管理 Java/JVM 应用的运行时,不过本书不会详细介绍。
VisualGC 插件,如图 13-7 所示,是最简单的也是出现最早的垃圾回收调试工具之一。第 6 章提到过,做重要分析时使用垃圾回收日志要比 VisualGC 提供的基于 JMX 的视图好。话虽如此,但 VisualGC 仍是理解应用中垃圾回收行为很好的方式,而且还能进行深入分析。使用 VisualGC 几乎能实时查看 HotSpot 的内存池状况,而且开发者能看到垃圾回收循环中对象在不同区之间的游动。
