- 适用于 JDK 24 的 GraalVM(最新)
- 适用于 JDK 25 的 GraalVM(早期访问)
- 适用于 JDK 21 的 GraalVM
- 适用于 JDK 17 的 GraalVM
- 存档
- 开发构建
优化和性能
Native Image 提供了不同的机制,使用户能够优化生成的二进制文件,从而提升性能、减小文件大小、缩短构建时间、增强可调试性以及其他指标。
优化级别 #
与 gcc
和 clang
类似,用户可以使用 -O
选项控制优化级别。默认情况下,使用 -O2
,旨在实现性能、文件大小和构建时间之间的良好平衡。下表概述了不同的优化级别并解释了它们的适用场景。
级别 | 优化 | 用例 |
---|---|---|
-Ob |
精简 | 快速构建模式:通过避免耗时的优化来加速开发期间的构建。这有时也可以减小文件大小。 |
-Os |
精简 | 针对大小优化:-Os 启用所有 -O2 优化,但会显著增加代码或镜像大小的优化除外。通常以降低性能为代价创建尽可能小的镜像。 |
-O0 |
None | 通常与 -g 一起使用以改善调试体验。 |
-O1 |
基本 | 以性能换取减小的文件大小和构建时间。Oracle GraalVM 的 -O1 在某种程度上与 GraalVM Community Edition 中的 -O2 相当。 |
-O2 |
高级 | 默认:旨在以合理的文件大小实现良好性能。 |
旨在以更长的构建时间为代价实现最佳性能。Oracle GraalVM 会自动用于PGO 构建( |
全部 | 旨在以更长的构建时间为代价实现最佳性能。由 Oracle GraalVM 自动用于PGO 构建(--pgo 选项)。-O3 和 -O2 在 GraalVM Community Edition 中是相同的。 |
通过配置文件引导优化提升吞吐量 #
考虑使用配置文件引导优化(PGO)来优化应用程序以提升吞吐量。这些优化允许 Graal 编译器在提前编译(AOT-compiling)应用程序时利用分析信息,这类似于其作为 JIT 编译器运行时的情况。为此,请执行以下步骤:
- 使用
--pgo-instrument
构建您的应用程序。 - 运行您的插桩应用程序,使用代表性工作负载生成分析信息。从本次运行中收集到的配置文件默认存储在 default.iprof 文件中。
- 使用
--pgo
选项重新构建您的应用程序。您可以使用--pgo=<your>.iprof
传递自定义的 .iprof 文件,否则将使用 default.iprof。这将重新构建您的镜像并生成应用程序的优化版本。
注意:在 GraalVM Community Edition 中不可用。
有关此主题的更多信息,请参阅配置文件引导优化的基本用法。
ML 驱动的配置文件推断以增强性能 #
Native Image 支持机器学习驱动的静态分析,作为一项内置功能。默认情况下,GraalVM 在 -O2
优化级别运行,该级别使用简单快速的 Graal 静态分析器 (GraalSP) 进行配置文件推断。此模型针对广泛的应用程序进行了优化。
自 GraalVM for JDK 24 起,新的 Graal 神经网络 (GraalNN) 静态分析器可用于 ML 驱动的配置文件推断,提供更好的性能。通过将 -O3
选项传递给 Native Image 即可启用它。
注意:在 GraalVM Community Edition 中不可用。
请注意,如果用户使用 --pgo
选项提供了 PGO 配置文件,则无需额外的 ML 推断,因此会自动禁用此功能。
要点
- GraalSP(简单模型)默认与
-O2
一起使用。 - GraalNN(高级模型)默认与
-O3
一起使用。
针对特定机器进行优化 #
Native Image 提供了 -march
选项,其工作方式类似于 gcc
和 clang
中的选项:它允许用户控制 Graal 编译器在将代码编译为原生代码时可以使用的指令集。默认情况下,Native Image 在 x64 上使用 x86-64-v3
,在 AArch64 上使用 armv8-a
。使用 -march=list
可以列出所有可用的机器类型。如果生成的二进制文件是在与其部署机器相同或相似的机器类型上构建的,请使用 -march=native
。此选项指示编译器使用在生成二进制文件的机器上找到的所有可用指令。另一方面,如果生成的二进制文件分发给拥有许多不同且可能非常旧的机器的用户,请使用 -march=compatibility
。这将编译器使用的指令集减少到最低限度,从而提高生成二进制文件的兼容性。
附加功能 #
Native Image 提供了额外的功能来进一步优化生成的二进制文件:
- 选择合适的垃圾收集器并调整垃圾收集策略可以减少 GC 时间。请参阅内存管理。
- 使用压缩引用可以提高内存效率。请参阅Native Image 中的对象头大小。
- 在镜像构建期间加载应用程序配置可以加快应用程序启动速度。请参阅镜像构建时的类初始化。
- 构建输出可能会提供其他建议,帮助您充分利用 Native Image。请参阅构建输出:建议。