◀返回
优化原生可执行文件以减小文件大小
您可以通过利用不同的优化级别来优化您的原生可执行文件。本指南将演示如何使用大小优化选项 -Os
为给定应用程序创建小型原生可执行文件。
-Os
启用-O2
优化,但排除那些可能显著增加代码或可执行文件大小的优化。通常,它会以降低性能为代价创建尽可能小的可执行文件。在优化级别中了解更多信息。
前提条件
请确保您已安装适用于 JDK 23 或更高版本的 Oracle GraalVM。最简单的入门方法是使用 SDKMAN!。有关其他安装选项,请访问下载部分。
对于演示,运行一个“算命先生”应用程序,该应用程序模拟传统的 fortune
Unix 程序(有关更多信息,请参阅 fortune)。
- 克隆 GraalVM Demos 仓库
git clone https://github.com/graalvm/graalvm-demos.git
- 将目录更改为 fortune-demo/fortune-maven
cd native-image/native-build-tools/maven-plugin
使用默认配置构建原生可执行文件
- 使用用于 Native Image 构建的 Maven 插件创建原生可执行文件
./mvnw -Pnative package
此命令编译项目,创建包含所有依赖项的 JAR 文件,然后在 target 目录中生成一个名为
fortune
的原生可执行文件。 - (可选) 运行应用程序
./target/fortune
应用程序将返回一个随机格言。
- 检查文件大小,它应该约为 13M
du -h target/fortune
构建一个针对大小优化的原生可执行文件
接下来,创建一个开启了大小优化的原生可执行文件,并为输出文件指定一个不同的名称,以便与之前的构建区分开来。
- 打开 pom.xml 文件。找到
native-maven-plugin
声明,并注意<configuration>
元素中的以下构建参数<configuration> <imageName>fortune-optimized</imageName> <buildArgs> <buildArg>-Os</buildArg> <buildArg>--emit build-report</buildArg> </buildArgs> </configuration>
-Os
选项启用大小优化。--emit build-report
选项在 target 目录中生成一份构建报告以及其他工件。 - 创建第二个原生可执行文件
./mvnw -Pnative package
该命令在 target 目录中生成一个可执行文件
fortune-optimized
。 - 比较所有相关输出文件的大小
du -h target/fortune*
您应该会看到类似以下内容的输出
13M target/fortune 16K target/fortune-1.0-SNAPSHOT.jar 9.8M target/fortune-optimized 1.9M target/fortune-optimized-build-report.html
文件大小从 13M 减小到 9.8M!
-Os
选项能将文件大小减小多少因应用程序而异,并且取决于 Native Image 在默认 -O2
模式下应用内联及其他可能增加大小的优化程度。
上一步中生成的构建报告 fortune-optimized-build-report.html 精确地说明了您的原生可执行文件中包含哪些内容。这是一个 HTML 文件,您可以在常规网页浏览器中打开它。
如果您的原生可执行文件大小相当大,您可能需要检查嵌入式资源列表、代码区中包含的模块和包列表,或镜像堆中的对象类型列表,并检查这些元素是否对您的应用程序至关重要。有时,由于可达性元数据资源配置中错误的正则表达式模式,大文件会意外地作为资源嵌入。为反射注册错误或过多的 Java 类型也可能显著增加原生可执行文件的大小,因为它会意外地使应用程序、库或 JDK 中不必要的部分可达。此外,如果构建时初始化没有用于特定目的,它可能导致大型 Java 对象(如空缓存)意外地包含在镜像堆中,从而导致原生可执行文件膨胀。
通常,最好不时检查文件大小、嵌入式资源数量或其他指标,例如在添加或更新依赖项时,甚至频繁监控构建指标。为此,您可以使用构建输出的机器可读版本或GitHub Actions 的构建报告。
除了改进其他指标外,还有其他 Native Image 技术可以积极影响可执行文件大小,例如配置文件引导优化 (PGO)。