VisualVM 是一个 Java 分析和性能分析工具。它有一个可视化界面来分析在 JVM 上本地和远程环境中运行的 Java 应用程序的详细信息。它集成并利用了 JDK 提供的命令行工具,如 jstack、jconsole、jmap、jstat 和 jinfo。这些工具是标准 JDK 发行版的一部分。 VisualVM 有助于解决运行时问题,具有堆转储和线程分析等功能。它有助于确定应用程序性能以及它与基准的对比。它还有助于确保最佳内存使用。它还有助于监控垃圾收集器、分析 CPU 使用情况、分析堆数据和跟踪内存泄漏。以下是 VisualVM 使用的每个命令行工具的用途:
- jstack: This tool is used to capture the thread dumps of a Java application
- jmap: This tool prints shared object memory maps and heap memory details for a given process
- jstat: This tool displays performance statistics for JVMs running the application
- jinfo: This tool prints Java configuration information
VisualVM 是标准 JDK 包的一部分。它首先在 JDK 版本 6 更新 7 中与 JDK 平台捆绑在一起。它也可以单独安装。让我们详细看看每个部分:
The Applications window view of VisualVM
从前面的截图可以看出,在窗口的左侧,有一个 Applications 窗口。 Applications 窗口有节点和子节点。可以展开节点和子节点以查看配置的应用程序和保存的文件。我们可以通过右键单击节点并从出现的弹出菜单中选择项目来查看其他信息或执行操作。弹出菜单选项因所选节点而异。
在 Applications 窗口内,我们可以看到 Local 节点的菜单。本地节点显示有关进程名称和与 VisualVM 在同一台机器上运行的 Java 进程的进程标识符的信息。启动 VisualVM 后,本地节点会在 Local 根节点展开时自动填充。 VisualVM 始终作为本地节点之一加载。服务终止时节点自动消失。如果我们获取应用程序的线程转储和堆转储,它们会像子节点一样显示。
可以使用 VisualVM 连接到在远程机器上运行的 JVM。所有此类正在运行的进程或应用程序都显示在 Remote 节点下。与远程节点建立连接后,我们可以展开 Remote 节点来查看远程机器上运行的所有 Java 应用程序。
VM Coredumps 节点仅在应用程序在 Linux 或 Solaris 操作系统上运行时可见。在 VisualVM 中打开核心转储文件时,VM Coredumps 节点会显示打开的核心转储文件。它是一个二进制文件,包含有关机器运行时状态的信息。
Applications 窗口的最后一部分标记为 Snapshots。 Snapshots 部分显示应用程序运行时拍摄的所有已保存快照。
本地或远程应用程序的数据显示在 VisualVM 的选项卡中。查看应用程序数据时,默认打开 Overview 选项卡。 Overview 选项卡显示信息,包括进程 ID、系统位置、应用程序的主类、Java 安装路径、传递的 JVM 参数、JVM 标志和系统属性。
列表中的下一个选项卡是 Monitor 选项卡。 Monitor 选项卡可用于查看堆内存、永久代堆内存以及类和线程数的实时信息。这里的类表示加载到虚拟机中的类。应用程序监控过程的开销很低。
Monitor 选项卡上的堆图显示总堆大小和当前使用的堆大小。永久代区域在一段时间内的变化显示在 PermGen 图中。类图显示加载和共享类的总数。 Threads 部分显示了活动线程和守护线程的数量信息。 VisualVM 可用于进行线程转储,它显示特定时间线程的准确信息。
在 Monitor 选项卡中,我们可以强制执行垃圾收集。该操作将立即运行垃圾收集。也可以从 Monitor 选项卡捕获堆转储:
VisualVM 在 Threads 选项卡中显示实时线程活动。默认情况下,Threads 选项卡显示当前线程活动的时间线。通过单击特定线程,我们可以在 Details 选项卡中查看有关该特定线程的详细信息。
Timeline 部分显示具有实时线程状态的时间线。我们可以通过在下拉菜单中选择适当的值来过滤显示的线程类型。在前面的屏幕截图中,它显示了 Live threads 时间线。我们还可以通过从下拉菜单中选择它来查看所有线程或已完成的线程。
我们可以选择在应用程序运行时对应用程序进行线程转储。打印时,线程转储显示了一个线程堆栈,其中包括 Java 应用程序的线程状态。
Profiler 选项卡可以启动和停止应用程序的分析会话。结果显示在 Profiler 选项卡本身中。可以为 CPU 分析或内存分析进行分析。启动分析会话后,VisualVM 连接到应用程序以开始收集分析数据。一旦结果可用,它们会自动显示在 Profiler 选项卡中。