返回

优化原生可执行文件以减小文件大小

您可以通过利用不同的优化级别来优化您的原生可执行文件。本指南将演示如何使用大小优化选项 -Os 为给定应用程序创建小型原生可执行文件。

-Os 启用 -O2 优化,但排除那些可能显著增加代码或可执行文件大小的优化。通常,它会以降低性能为代价创建尽可能小的可执行文件。在优化级别中了解更多信息。

前提条件

请确保您已安装适用于 JDK 23 或更高版本的 Oracle GraalVM。最简单的入门方法是使用 SDKMAN!。有关其他安装选项,请访问下载部分。

对于演示,运行一个“算命先生”应用程序,该应用程序模拟传统的 fortune Unix 程序(有关更多信息,请参阅 fortune)。

  1. 克隆 GraalVM Demos 仓库
     git clone https://github.com/graalvm/graalvm-demos.git
    
  2. 将目录更改为 fortune-demo/fortune-maven
     cd native-image/native-build-tools/maven-plugin
    

使用默认配置构建原生可执行文件

  1. 使用用于 Native Image 构建的 Maven 插件创建原生可执行文件
     ./mvnw -Pnative package
    

    此命令编译项目,创建包含所有依赖项的 JAR 文件,然后在 target 目录中生成一个名为 fortune 的原生可执行文件。

  2. (可选) 运行应用程序
     ./target/fortune
    

    应用程序将返回一个随机格言。

  3. 检查文件大小,它应该约为 13M
     du -h target/fortune
    

构建一个针对大小优化的原生可执行文件

接下来,创建一个开启了大小优化的原生可执行文件,并为输出文件指定一个不同的名称,以便与之前的构建区分开来。

  1. 打开 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 目录中生成一份构建报告以及其他工件。

  2. 创建第二个原生可执行文件
     ./mvnw -Pnative package
    

    该命令在 target 目录中生成一个可执行文件 fortune-optimized

  3. 比较所有相关输出文件的大小
     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)

联系我们