VisualVM

GraalVM 为 VisualVM 提供支持,这是一个一体化的 Java(和多语言)监控和故障排除工具。VisualVM 使得功能强大且易于使用的 Java 工具成为可能,其中包括对支持的客座语言的堆分析。目前提供以下语言和功能

  • Java:堆摘要、对象视图、线程视图、OQL 控制台
  • JavaScript:堆摘要、对象视图、线程视图
  • Python:堆摘要、对象视图
  • Ruby:堆摘要、对象视图、线程视图
  • R:堆摘要、对象视图

启动 VisualVM #

  1. visualvm.github.io 下载最新版 VisualVM,解压缩,然后将其移动到应用程序目录。

  2. 双击应用程序图标以启动。

启动后,该工具会在“应用程序”区域显示所有本地运行的 Java 进程,包括 VisualVM 本身。

捕获堆转储 #

要捕获例如 Ruby 应用程序的堆转储以供以后分析,请启动应用程序并让它运行几秒钟以预热。然后在 VisualVM 中右键单击其进程,并调用“堆转储”操作。将打开 Ruby 进程的新堆查看器。

注意:使用 原生镜像 时,必须明确启用堆转储支持。在调用 native-image 工具时添加 --enable-monitoring=heapdump,jvmstat 选项以启用堆转储功能并允许 VisualVM 通过 jvmstat 检测原生可执行文件。这样,您的应用程序将处理信号并在收到 SIGUSR1 信号时捕获堆转储。有关从原生镜像进程捕获堆转储的详细信息,请参见 生成原生堆转储 页面。

分析对象 #

最初将显示 Java 堆的摘要视图。要分析 Ruby 堆,请单击堆查看器工具栏中最左边的(摘要)下拉菜单,选择 Ruby 堆范围,然后选择“对象”视图。现在,堆查看器将显示所有 Ruby 堆对象,按其类型聚合。

在“结果”视图中展开“Proc”节点以查看此类型对象的列表。每个对象都显示其由底层实现提供的逻辑值。展开对象以访问其变量和引用(如果可用)。

VisualVM: Heap Viewer Objects

现在,通过单击工具栏中的按钮启用“预览”、“变量”和“引用”详细信息,然后选择各个 ProcType 对象。如果可用,“预览”视图将显示相应的源代码片段,“变量”视图将显示对象的变量,“引用”视图将显示引用所选对象的那些对象。

最后,使用堆查看器工具栏中的“预设”下拉列表,将视图从“所有对象”切换到“支配者”或“GC 根”。要显示堆支配者,必须首先计算保留大小,这对于 server.rb 示例可能需要几分钟。选择工具栏中的“对象”聚合以查看各个支配者或 GC 根。

VisualVM: Heap Viewer Objects Dominators

分析线程 #

单击堆查看器工具栏中最左边的下拉列表,然后选择 Ruby 堆的“线程”视图。堆查看器现在将显示 Ruby 线程堆栈跟踪,包括本地对象。堆栈跟踪也可以通过单击 HTML 工具栏按钮以文本形式显示。

VisualVM: Heap Viewer Thread

读取 JFR 快照 #

与 GraalVM 19.2.x 及更高版本捆绑在一起的 VisualVM 工具能够读取 JFR 快照,这些快照是由 JDK Flight Recorder(以前称为 Java Flight Recorder)拍摄的。JFR 是一种用于收集有关正在运行的 Java 应用程序的诊断和性能分析数据的工具。它集成到 Java 虚拟机 (JVM) 中,并且几乎不会造成性能开销,因此它甚至可以在负载很重的生产环境中使用。

要安装作为插件发布的 JFR 支持

  1. 运行 $JAVA_HOME/bin/jvisualvm 以启动 VisualVM;
  2. 导航到“工具”>“插件”>“可用插件”以列出所有可用插件,然后安装 VisualVM-JFRVisualVM-JFR-Generic 模块。

可以使用“文件”>“加载”操作打开 JFR 快照,或者通过双击“JFR 快照”节点并将快照永久添加到 JFR 存储库中来打开。请遵循您 Java 版本的文档以创建 JFR 快照。

JFR 查看器读取从 Java 7 开始创建的所有 JFR 快照,并将数据以工具用户熟悉的典型 VisualVM 视图呈现。

VisualVM: Viewing JFR via VisualVM

目前提供以下视图和功能选项卡

  • “概述”选项卡 - 显示有关录制进程的基本信息,例如其主类、参数、JVM 版本和配置以及系统属性。此选项卡还提供对已录制线程转储的访问。
  • “监控”选项卡 - 显示进程运行时间和基本遥测数据:CPU 使用率、堆和元空间使用率、已加载类的数量以及活动线程和已启动线程的数量。
  • “线程”选项卡 - 基于快照中记录的所有事件,尽可能精确地重建线程时间线,具体取决于录制配置。
  • “锁”选项卡 - 允许用户分析线程同步。
  • “文件 I/O”选项卡 - 显示对文件系统的读写事件信息。
  • “套接字 I/O”选项卡 - 显示对网络的读写事件信息。
  • “采样器”选项卡 - 显示每个线程的 CPU 使用率和内存分配,以及堆直方图。还有一个实验性功能“CPU 采样器”,用于从记录的事件中构建 CPU 快照。它没有提供精确的性能分析,但仍然有助于了解已记录应用程序中的情况以及 CPU 瓶颈可能在哪里。
  • “浏览器”选项卡 - 提供对快照中记录的所有事件的通用浏览器。
  • “环境”选项卡 - 概述录制机器的设置和条件,例如 CPU 型号、内存大小、操作系统版本、CPU 使用率、内存使用率等。
  • “录制”选项卡 - 列出录制设置和基本快照遥测数据,例如事件数量、总录制时间等。

注意:JDK Flight Recorder 的支持目前处于实验阶段。一些高级功能(例如分析 JVM 内部、显示事件堆栈跟踪或支持从实时进程创建 JFR 快照)在此预览版中不可用,将在后续版本中逐步解决。

与我们联系