核心是用jlink构建最小化运行时:通过JPMS模块化裁剪,仅保留应用所需模块(如java.base、java.logging),结合jdeps自动分析依赖,生成40–60MB精简JRE,再经多阶段Dockerfile打包,彻底替代200MB+完整JRE。

核心在于用 jlink 构建最小化运行时,而非直接“减少Java变量”——Java变量本身不占镜像空间,真正膨胀的是整个JDK环境。模块化系统(Java 9+ 的 JPMS)让开发者能精确裁剪JRE,剔除应用完全不用的模块,从而大幅压缩镜像体积。
用 jlink 构建自定义 JRE
Spring Boot 等框架实际只用到 JDK 中约 20–30% 的模块。jlink 可基于运行时依赖分析,生成仅含必需模块的轻量 JRE。
- 先用
jdeps --list-deps your-app.jar列出显式依赖的模块(如 java.base、java.logging、java.xml) - 再执行:
jlink --module-path $JAVA_HOME/jmods --add-modules java.base,java.logging,java.xml --output jre-minimal - 输出目录
jre-minimal即为精简后的运行时,通常仅 40–60MB,远小于完整 JRE 的 200MB+
自动化依赖分析避免漏模块
手动列模块易出错,导致运行时报 NoClassDefFoundError。推荐结合 jdeps --print-module-deps 和构建脚本自动提取。
- 在 Maven 构建后添加执行目标,调用
jdeps -s --multi-release 17 target/*.jar - 解析输出,过滤掉
jdk.开头的非必要模块(如 jdk.compiler、jdk.javadoc) - 将结果注入 jlink 命令,确保所有间接依赖(如 java.desktop 的子依赖)也被包含
配合多阶段 Dockerfile 落地
把 jlink 构建过程放进第一阶段,最终镜像只保留精简 JRE + 应用 Jar,彻底剥离构建工具和冗余文件。
立即学习“Java免费学习笔记(深入)”;
- 第一阶段用
openjdk:17-jdk-slim,安装构建所需工具并运行 jlink - 第二阶段用
scratch或debian:slim,COPY jre-minimal 和 jar - ENTRYPOINT 直接调用
/jre-minimal/bin/java -jar /app.jar,不依赖系统 PATH
注意容器环境下的 JVM 兼容性
裁剪后 JRE 必须支持容器内存/CPU 感知,否则仍会因堆配置错误触发 OOM。
- 确保 jlink 输出的 JRE 包含
java.management和jdk.management模块(用于读取 cgroup) - 启动参数中启用容器支持:
--add-opens java.base/java.lang=ALL-UNNAMED -XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 - 避免使用
alpine + glibc组合——jlink 生成的二进制依赖标准 libc,Alpine 的 musl 不兼容,应选debian:slim或ubi8-minimal


















