- 适用于 JDK 23 的 GraalVM(最新)
- 适用于 JDK 24 的 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
启动 IGVmx -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
。可以选择指定端口。然后,转储将从运行在 localhost 上的 GraalVM 发送到 IGV。如果 IGV 未侦听 localhost,请检查“选项”,然后选中“理想图设置 | 接受来自网络的数据”。如果在 127.0.0.1
上没有侦听的 IGV 实例,或者无法连接到该实例,则转储将被重定向到本地文件系统。文件系统位置是进程当前工作目录下的 graal_dumps/
,可以使用 -Djdk.graal.DumpPath
选项更改该位置。
如果使用的是较旧版本的 GraalVM,您可能需要明确要求转储包含 nodeSourcePosition
属性。这可以通过添加 -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints
选项来完成。