- 适用于 JDK 24 的 GraalVM(最新)
- 适用于 JDK 25 的 GraalVM(早期访问)
- 适用于 JDK 21 的 GraalVM
- 适用于 JDK 17 的 GraalVM
- 存档
- 开发构建
理想图可视化工具
理想图可视化工具 (IGV) 是一个开发工具,用于分析编译图并排查性能问题。IGV 旨在查看和检查中间表示图——一种由编译器生成的、介于源语言和机器码之间的语言无关中间表示 (IR)。对于任何基于 GraalVM 构建的语言实现者来说,这都至关重要。
开发 IGV 工具旨在帮助 GraalVM 语言实现者优化其使用Truffle 框架构建的语言。作为开发工具,它不应安装在生产环境中。
先决条件 #
开始使用 #
IGV 可免费使用,并且必须在用户机器上使用 mx
工具构建 — 一个用于构建、测试、运行、更新代码以及为 GraalVM 构建工件的命令行工具。
- 将
mx
仓库克隆到您的工作目录git clone https://github.com/graalvm/mx.git
- 克隆 Graal 仓库
git clone https://github.com/oracle/graal.git
- 将
mx
添加到PATH
环境变量export PATH="/path/to/mx:$PATH"
要检查安装是否成功,请运行以下命令
mx --version
- 使用
mx
启动 IGV:mx -p graal/compiler igv
使用 Ruby 示例转储图 #
现在,您将使用一个嵌入了部分 Java 的宿主 Ruby 应用程序,通过网络转储编译器图。
-
将以下代码片段保存到名为
Test.rb
的文件中require 'json' obj = { time: Time.now, msg: 'Hello World', payload: (1..10).to_a } encoded = JSON.dump(obj) js_obj = Polyglot.eval('js', 'JSON.parse').call(encoded) puts js_obj[:time] puts js_obj[:msg] puts js_obj[:payload].join(' ')
- 使用 Ruby 管理器/安装程序从 TruffleRuby 独立版本安装 Ruby。检查其版本以确保您正在运行 TruffleRuby 分发版
ruby --version
- 运行应用程序,将进程连接到正在运行的 IGV
ruby --vm.Djdk.graal.Dump=:1 --vm.Djdk.graal.PrintGraph=Network Test.rb
这会将编译器图以 IGV 格式通过网络转储到监听 *127.0.0.1:4445* 的 IGV 进程。建立连接后,您可以在“大纲”视图中看到这些图。例如,找到 java.lang.String.char(int)
文件夹并双击打开其“解析后”图。如果节点具有 sourceNodePosition
属性,则“处理”窗口将尝试显示其位置和整个堆栈跟踪。
浏览图 #
打开特定图后,您可以按名称、ID 或 property=value
数据搜索节点,所有匹配结果都将显示。此工具的另一个强大功能是能够导航到原始客户语言源代码。在图中选择一个节点,然后单击“堆栈视图”窗口中的“转到源代码”按钮。
图导航也可通过上下文菜单获得,通过聚焦并右键单击特定图节点即可启用。“提取节点”选项会重新渲染图,并仅显示选定的节点及其邻居。
如果图大于屏幕,请使用主工具栏中的“卫星视图”按钮来移动视口矩形。
为了用户偏好,可以通过编辑“着色”过滤器来调整图的配色方案,该过滤器默认在左侧边栏中启用。
查看源代码 #
源代码视图可以在手动和辅助模式下打开。在图视图中选择一个节点后,“处理”视图会打开。如果 IGV 知道当前帧的源代码位置,则绿色的“转到源代码”箭头会启用。如果 IGV 不知道源代码位置,该行会变灰并出现一个“放大镜”按钮。
按下它并选择“在 Java 项目中定位”以在对话框中找到正确的项目。IGV 会隐藏不包含所需源文件的项目。“源集合”用于显示通过“添加源根目录”通用操作添加的独立根目录。如果使用首选方法(例如,从 Java 项目)定位源代码,其项目稍后可以在“项目”选项卡上进行管理。该选项卡最初是隐藏的,但您可以使用“窗口”,然后选择“项目”来显示已打开的项目列表。
从嵌入式 Java 转储图 #
要将 GraalVM 编译器图从嵌入式 Java 应用程序转储到 IGV,您需要向基于 GraalVM 的进程添加选项。根据所使用的语言/VM,您可能需要使用 --vm
作为选项前缀。详细信息请参见相应语言的文档。要添加的主要选项是 -Djdk.graal.Dump=:1
。这会将图以 IGV 可读格式转储到本地文件系统。要通过网络直接将转储发送到 IGV,在启动 GraalVM 实例时添加 -Djdk.graal.PrintGraph=Network
。也可以选择指定一个端口。然后,转储会从本地主机上运行的 GraalVM 发送到 IGV。如果 IGV 未在本地主机上监听,请在“选项”下检查,然后勾选“理想图设置|接受来自网络的数据”。如果没有 IGV 实例在 127.0.0.1
上监听,或者无法连接,则转储将被重定向到本地文件系统。文件系统位置在进程当前工作目录下的 graal_dumps/
中,可以通过 -Djdk.graal.DumpPath
选项进行更改。
如果使用旧版 GraalVM,您可能需要明确要求转储包含 nodeSourcePosition
属性。这可以通过添加 -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints
选项来完成。