| 基础镜像 | 大小 | 说明 |
|---|---|---|
openjdk:17.0.2-jdk-slim |
~500MB | 当前使用,包含 JDK |
openjdk:17.0.2-jre-slim |
~300MB | JRE only,减少 200MB |
eclipse-temurin:17-jre-alpine |
~150MB | ✅ 推荐,最小化 |
选择 Alpine 的优势:
-Djava.awt.headless=true # 禁用 AWT/Swing GUI
-Djava.net.preferIPv4Stack=true # 优先使用 IPv4
-Xss256k # 线程栈大小:256KB
-XX:+DisableExplicitGC # 禁用 System.gc()
保留原因:
-Djava.awt.headless=true
-Djava.net.preferIPv4Stack=true
-Xss256k
-XX:+DisableExplicitGC
System.gc() 影响 GC❌ -Xmx512m # 删除:K8S 通过 resources.limits.memory 管理
❌ -Xms512m # 删除:K8S 通过 resources.requests.memory 管理
❌ -Xmn256m # 删除:新生代大小由 K8S 内存限制决定
删除原因:
K8S 配置示例:
resources:
requests:
memory: "512Mi" # 替代 -Xms512m
limits:
memory: "1024Mi" # 替代 -Xmx512m
❌ -XX:PermSize=256m # 删除:Java 8+ 已移除 PermGen
❌ -XX:MaxPermSize=256m # 删除:改为 Metaspace 自动管理
删除原因:
❌ -XX:+UseConcMarkSweepGC # 删除:Java 17 已弃用 CMS
❌ -XX:+CMSParallelRemarkEnabled # 删除:CMS 参数
❌ -XX:+UseCMSCompactAtFullCollection # 删除:CMS 参数
❌ -XX:+UseCMSInitiatingOccupancyOnly # 删除:CMS 参数
❌ -XX:CMSInitiatingOccupancyFraction=70 # 删除:CMS 参数
删除原因:
-XX:+UseG1GC(可选,Java 17 已默认)❌ -server # 删除:K8S 容器已是服务模式
❌ -XX:LargePageSizeInBytes=128m # 删除:K8S 不推荐使用大页面
❌ -XX:+UseFastAccessorMethods # 删除:现代 JVM 已默认优化
删除原因:
-server:容器环境本质就是服务器模式,指定无意义-XX:LargePageSizeInBytes:K8S 调度器更好地处理内存,不需要 JVM 干预-XX:+UseFastAccessorMethods:Java 8+ JVM 自动启用,显式指定无效在 Kubernetes 部署中,应该这样配置内存和 GC:
# Deployment YAML 示例
spec:
containers:
- name: shop-recycle-gateway
image: your-registry/shop-recycle-gateway:1.0.0
ports:
- containerPort: 1211
# ✅ 资源限制由 K8S 管理,不用 JVM 参数
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1024Mi"
cpu: "1000m"
# ✅ 环境变量配置
env:
- name: JAVA_OPTS
value: "-Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Xss256k -XX:+DisableExplicitGC"
# ✅ 健康检查由 K8S 管理(比 Dockerfile HEALTHCHECK 更优)
livenessProbe:
httpGet:
path: /actuator/health
port: 1211
initialDelaySeconds: 40
periodSeconds: 10
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 1211
initialDelaySeconds: 30
periodSeconds: 5
# 最小化方案:仅保留必须参数
JAVA_OPTS="-Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Xss256k -XX:+DisableExplicitGC"
# 扩展方案:添加日志和监控参数
JAVA_OPTS="-Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Xss256k -XX:+DisableExplicitGC \
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 \
-Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai"
说明:
-XX:+UseG1GC:显式启用 G1GC(可选,Java 17 已默认)-XX:MaxGCPauseMillis=200:目标 GC 暂停时间 ≤ 200ms-Dfile.encoding=UTF-8:字符编码-Duser.timezone=Asia/Shanghai:时区设置--spring.config.location=/app/conf/application.yml
问题: 只能加载一个文件
--spring.config.location=file:/app/conf/
优势:
application.yml, application.properties, application-dev.yml 等支持的配置文件格式:
/app/conf/
├── application.yml # 基础配置
├── application-prod.yml # 生产环境特定配置
├── application-prod-db.yml # 数据库配置
└── application-prod-cache.yml # 缓存配置
加载优先级(Spring Boot 默认):
application.ymlapplication-{profile}.yml(根据 active profile)docker build -t your-registry/shop-recycle-gateway:1.0.0 -f Dockerfile.optimized .
# 使用环境变量设置 JAVA_OPTS
docker run -d \
-e JAVA_OPTS="-Djava.awt.headless=true -Djava.net.preferIPv4Stack=true" \
-v /path/to/conf:/app/conf \
-p 1211:1211 \
your-registry/shop-recycle-gateway:1.0.0
| 项目 | 优化前 | 优化后 | 改进 |
|---|---|---|---|
| 基础镜像 | openjdk:17.0.2-jdk-slim | eclipse-temurin:17-jre-alpine | 减少 70% 大小 |
| 镜像包含物 | JDK + 工具 | JRE only | 移除不必要工具 |
| JAVA_OPTS | 19 个参数 | 4 个参数 | 删除过时/冗余参数 |
| 启动时间 | ~5-10s | ~2-3s | 更快启动 |
| 内存管理 | JVM 参数控制 | K8S 资源限制 | 更清晰 |
| 配置管理 | 单个文件 | 整个目录 | 更灵活 |