- 适用于 JDK 24 的 GraalVM(最新)
- 适用于 JDK 25 的 GraalVM(早期访问)
- 适用于 JDK 21 的 GraalVM
- 适用于 JDK 17 的 GraalVM
- 存档
- 开发构建
Native Image 构建报告
构建报告是专门为 GraalVM Native Image 定制的一个独立 HTML 页面报告。该报告提供了关于每个构建阶段以及生成的二进制文件内容的广泛信息。在这里,您将学习如何生成构建报告以及如何使用报告的每个部分。
注意:构建报告在 GraalVM Community Edition 中不可用。
目录 #
报告生成 #
一个简单的 HelloWorld Micronaut 应用程序(可在 GraalVM Demos 仓库中找到)用于演示构建报告的生成及其结构。
只需在运行 native-image
命令时使用 --emit
选项即可生成构建报告
native-image --emit build-report -cp . Application
对于使用 适用于 Native Image 的 Maven 插件 的 Micronaut 示例,只需在插件配置中添加选项 --emit build-report
即可
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<configuration>
...
<buildArgs combine.children="append">
<buildArg>--emit build-report</buildArg>
...
</buildArgs>
</configuration>
</plugin>
构建成功后,报告会自动与生成的二进制文件一同创建。指向 HTML 页面(默认为 <binary-name>-build-report.html)的链接将列在构建输出末尾的 构建工件 部分中
========================================================================================================================
GraalVM Native Image: Generating 'MnHelloRest' (executable)...
========================================================================================================================
...
Build artifacts:
.../graalvm-demos/micronaut-hello-rest-maven/target/MnHelloRest (executable)
.../graalvm-demos/micronaut-hello-rest-maven/target/MnHelloRest-build-report.html (build_info) <----- generated report
========================================================================================================================
Finished generating 'MnHelloRest' in 36.0s.
此外,可以通过将文件名或路径附加到 build-report
参数来自定义报告的文件名或路径。这在例如使用不同配置创建同一应用程序的多个二进制文件时非常有用
native-image -0b --emit build-report=/tmp/application-build-report-default.html -cp . Application
native-image -0s --emit build-report=/tmp/application-build-report-size-optimized.html -cp . Application
报告结构 #
每个报告页面都包含多个部分或选项卡,每个部分或选项卡显示与其标题对应的数据。最初显示的是 摘要 部分,此外还有 代码区、镜像堆、资源、软件物料清单 (SBOM) 和 PGO 采样配置文件(仅在 PGO 构建中)等部分。每个部分都将在以下小节中详细描述。
摘要 #
摘要 部分提供了构建的总体概览。该部分包含四个小节,分别对应构建过程中的一个阶段或提供额外的有用信息
- 环境 提供了构建中使用的环境信息(Java 版本、GraalVM 版本、Graal 编译器配置等)。
- 分析结果 显示了点对点分析的结果(类型、字段和方法),按类别(可达、反射、JNI 和已加载)分组。
- 镜像详情 提供了二进制文件内容的概览。图表可视化了二进制文件的不同部分(代码区、镜像堆、调试信息和其他数据)在大小方面的相互关系。
- 安全报告 报告了有关构建的各种安全相关信息(反序列化、嵌入式 SBOM 和反向边缘控制流完整性 (CFI))。
- 资源使用 提供了有关构建所用资源(垃圾收集、峰值 RSS 和 CPU 负载)以及生成二进制文件所花费的总时间的额外信息。
注意:将鼠标悬停在 镜像详情 中的每个条形图上以查看更多信息。此外,单击 代码区 和 镜像堆 条形图可链接到其各自的部分。
所有这些信息也以 JSON 格式提供,可以通过单击页面右上角的 下载为 JSON 下载。
代码区 #
代码区 部分提供了静态分析后可达代码的深入视图。它由两个相互关联的部分组成:一个 细分图表 和一个 包和类的列表。
基于方法的细分
二进制的代码区按包进行细粒度的方法级别分解。分解只考虑点对点分析找到的可达方法。它以旭日图的形式可视化:一种分层多级饼图。
图表显示了不同包(和类)之间的相互关系。这些比例是基于累积方法 字节码大小(默认)或方法 总数 计算的。这可以通过页面右上角的 细分类型 下拉列表进行选择。
注意:使用固定阈值来限制图表中显示的数据量(相对于当前根包的总百分比的 0.1)。该阈值 仅 适用于细分图表,而下面的表格包含包和类的完整列表(在当前级别)。
百分比(显示在每个包弧中)表示同级包之间的关系。所有百分比都相对于根包计算(对于顶层视图是抽象的 总计 包,当深入到某个包时则是该包)。此外,将鼠标悬停在该包弧上可以查看特定包的具体值(无论是其方法字节码大小还是方法总数)。
此细分最重要功能是能够深入探索任意包的关系。只需单击任何感兴趣的包(至少有一个子包或类)即可实现此功能。返回父包的逆向操作同样可以通过单击“根”包(位于图表中心)来实现。
也可以返回到钻取链中的任何包(从 总计 到当前包)。只需单击图表正上方显示的钻取链中的特定包即可实现此功能。
此外,细分图表和包及类的列表是 同步的 — 每次钻取都会同时更新下方的表格,反之亦然。
包和类的列表
包和类的列表是主要细分的扩展。它列出了属于所选包(最初为 总计)的每个包和类。该表还显示了每个包和类的所有信息:其方法字节码大小(或方法总数)以及其相对百分比。
拥有子项(至少一个包或类)的包显示为 链接。单击链接可在细分图表中进行钻取 — 它们是 同步的。同样,通过单击 ↑(显示在第一行中)可以实现反向操作,即返回上一级(到父包)。
注意:只列出所选包的 直接 后代(并随每次钻取更新)。
镜像堆 #
二进制文件的对象堆按对象类型进行分解和分组(类似于 CLI 构建输出中的 镜像堆 表格)。主要区别在于构建报告显示了完整的对象类型列表,以及更详细的信息,例如它们的计数、大小和相对百分比(以进度条的形式可视化)。
完整列表的一个常见用例是确定特定类的任何实例是否是镜像堆的一部分(使用 页面查找)。
资源 #
“资源”选项卡可用于探索 Native Image 中包含的 Java 资源、它们的来源以及它们的大小如何影响整体镜像大小。这很有用,例如,可以检测由于可达性元数据不正确而意外包含或缺失的资源。
所有资源都列在主表中。默认情况下,通过配置文件显式请求的资源会显示出来。此外,还提供了另外三种资源:
- 缺失资源 是通过配置文件请求的,但系统中不存在。
- 注入资源 是通过 GraalVM SDK 以编程方式注册的(通常由框架用于协助 Native Image 编译)。
- 目录资源 是一种特殊的资源类型,代表目录(通常很小,因为它们只包含该目录内的文件和目录名称)。每种资源都可通过其对应的复选框在表中显示。
表中的资源可以通过左上角的搜索框按名称过滤。此外,列表可以按任何资源属性进行排序(使用表头中专用的 ↕ 排序按钮)。
软件物料清单 (SBOM) #
软件物料清单是构建最终二进制文件所涉及的所有工件的清单。每个工件都通过其完全限定名(组织名称 + 工件名称)及其特定版本进行唯一标识。构建中使用的所有工件都列在表中。
所有这些信息也以 CycloneDX 格式的 JSON 形式提供,可以通过单击 下载为 JSON 下载。
PGO 采样配置文件 #
PGO 采样配置文件仅存在于构建 PGO 优化二进制文件 时生成的报告中。本节在其专门的 PGO 指南 - 在构建报告中检查配置文件 中有详细描述。