使用Spring Boot 3.0.1与GraalVM 22.3.0构建native-image体积过大咨询
Native Image体积比Spring Boot Jar大的原因解析
自带精简版运行时:Jar包只是Java字节码集合,运行依赖系统已安装的JVM;而Native Image是自包含的可执行文件,内置了GraalVM的精简运行时(包含内存管理、线程调度等核心模块),这部分额外的运行时组件是Jar包没有的,会直接增加体积。
Spring Boot Native的兼容性兜底:为了保证Native Image能兼容Spring Boot的自动配置和扩展能力,默认构建策略会包含框架层面的基础组件,即便你的业务代码没用到某些模块,也可能因兼容性需求被保留。比如Web场景下的Mvc核心、数据访问的基础适配类,这些在Jar包中是按需加载,但Native Image会提前编译进可执行文件。
AOT编译的机器码冗余:Native Image是将Java字节码编译为本地机器码,机器码本身的体积就比字节码更“厚重”。同时为了优化运行时性能,GraalVM会生成一些辅助代码(比如类型校验、反射支持的桩代码),进一步增加了体积。
动态特性的预编译处理:Spring框架大量依赖反射、动态代理等动态特性,Native Image构建时必须提前分析并将所有可能用到的类、方法纳入编译范围,否则运行时会出现类找不到的错误。这就导致一些Jar包中可能不会被加载的类,也被强制包含到Native Image里。
默认包含调试信息:默认构建的Native Image会包含调试符号,这部分信息会显著增加体积。如果不需要调试功能,可以在构建时添加
--no-debug参数关闭,能有效减小可执行文件大小。
内容的提问来源于stack exchange,提问作者Rayyan
相关产品推荐
相关产品推荐

