原生镜像构建报告
构建报告是一个专门针对 GraalVM 原生镜像的单一 HTML 页面报告。该报告提供了有关每个构建阶段以及生成的二进制文件内容的广泛信息。您将在这里了解如何生成构建报告以及如何使用每个报告部分。
注意:构建报告在 GraalVM 社区版中不可用。
目录 #
报告生成 #
一个简单的 HelloWorld Micronaut 应用程序(在 GraalVM 演示存储库 中可用)用于演示构建报告的生成及其结构。
构建报告可以使用运行 native-image
命令时的 --emit
选项轻松生成
native-image --emit build-report -cp . Application
在使用 原生镜像的 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 构建输出中的 镜像堆 表)。主要区别在于构建报告显示了对象类型的完整列表,以及更多详细信息,例如它们的计数、大小和相对百分比(以进度条的形式可视化)。
完整列表的一个常见用例是确定镜像堆中是否包含特定类的任何实例(使用 页面内查找)。
资源 #
资源选项卡可用于探索包含在原生镜像中的 Java 资源,它们的来源,以及它们的大小如何影响镜像的总体大小。例如,这对于检测因错误的可达性元数据而意外包含或丢失的资源很有用。
所有资源都列在主表格中。默认情况下,会显示通过配置文件(s)明确请求的资源。此外,还提供了另外三种类型的资源
- 丢失的资源是通过配置文件(s)请求的,但在系统上不存在。
- 注入的资源是通过 GraalVM SDK 以编程方式注册的(通常由框架用于协助原生镜像编译)。
- 目录资源是一种特殊的资源类型,表示目录(通常很小,因为它们只包含该目录中文件和目录的名称)。每种资源类型都可以通过其对应的复选框显示在表格中。
表格中的资源可以通过左上角的搜索框按名称进行筛选。此外,列表可以通过任何资源属性进行排序(使用表格标题中的专用 ↕ 排序按钮)。
软件物料清单 (SBOM) #
软件物料清单代表构建最终二进制文件时涉及的所有工件的清单。每个工件都由其完全限定名(组织名称 + 工件名称)及其特定版本唯一标识。构建中使用的所有工件都列在表格中。
所有这些信息也可以作为 CycloneDX 格式的 JSON 获取,可以通过单击 下载为 JSON 来下载。
PGO 采样配置文件 #
PGO 采样配置文件是一个仅在生成 PGO 优化二进制文件 时构建的报告中存在的部分。该部分在其专用的 PGO 指南中进行了详细说明 - 在构建报告中检查配置文件。