Docker部署SpringBoot项目,JVM内存调到192M的配置经验
背景我自己部署SpringBoot项目时服务器是华为云最低配——1核2G。跑着一个MySQL、一个Redis、一个Nacos还剩多少内存给应用不到500M。如果按默认JVM参数跑一个SpringBoot启动就吃掉300M堆内存加上Metaspace和线程栈随随便便上500M。两个服务部署上去OOM。所以必须压JVM内存。最终我把单个服务堆内存压到了192M服务正常运行。分享这个过程中踩的坑和最终配置。选基础镜像SpringBoot官方推荐openjdk镜像但那玩意 400M。换成精简版FROM eclipse-temurin:17-jre-alpinejre而不是jdkalpine而不是完整版。体积从 400M 降到 180M。不需要JDK编译能力运行环境有JRE就够了。如果需要更极致的可以用distroless但调试不方便生产环境用 alpine 够好了。JVM内存怎么算总内存2G减去操作系统~200MMySQL~400MRedis~100MNacos~300MDocker本身~200M剩余约 800M。跑两个SpringBoot 一个网关每个应用不能超过 200M。JVM启动参数ENV JAVA_OPTS-Xms128m -Xmx192m \ -XX:MetaspaceSize64m -XX:MaxMetaspaceSize96m \ -XX:MaxDirectMemorySize32m \ -XX:ReservedCodeCacheSize32m \ -XX:UseSerialGC \ -XX:TieredCompilation \ -XX:TieredStopAtLevel1 \ -XX:UseContainerSupport \ -XX:InitialRAMPercentage25.0 \ -XX:MaxRAMPercentage50.0逐项解释为什么这么设堆内存 -Xms128m -Xmx192m初始128M最大192M。初始设低一点避免一启动就占满让其按需增长。192M对于大多数CRUD服务足够了——主要是查数据库和Redis不做什么计算密集操作。元空间 -XX:MetaspaceSize64m -XX:MaxMetaspaceSize96mSpringBoot一个项目上百个类元空间得给够。64M起步最大96M。实测下来不会超过80M。直接内存 -XX:MaxDirectMemorySize32mNIO用的。如果用了Netty比如WebClient这块要留一点。32M保守够用。GC策略 -XX:UseSerialGC单核CPU用SerialGC反而最快。别一上来就往G1上招呼小堆用SerialGC停顿短、内存开销小。编译优化 -XX:TieredCompilation -XX:TieredStopAtLevel1关闭C2编译只用C1。C2编译慢、内存消耗大。小应用不用追求极致吞吐C1编译足够还能省Metaspace。容器感知 -XX:UseContainerSupportDocker里必须加否则JVM默认读宿主机的内存而不是容器的。不加这个参数-XX:MaxRAMPercentage不会生效。百分比设限 -XX:InitialRAMPercentage25.0 -XX:MaxRAMPercentage50.0配合UseContainerSupport使用。如果Docker分配了400M内存最大堆只用到200M。比直接写-Xmx灵活。完整DockerfileFROM eclipse-temurin:17-jre-alpine ​ RUN addgroup -S app adduser -S app -G app USER app ​ WORKDIR /app COPY target/*.jar app.jar ​ ENV JAVA_OPTS-Xms128m -Xmx192m \ -XX:MetaspaceSize64m -XX:MaxMetaspaceSize96m \ -XX:MaxDirectMemorySize32m \ -XX:ReservedCodeCacheSize32m \ -XX:UseSerialGC \ -XX:TieredCompilation -XX:TieredStopAtLevel1 \ -XX:UseContainerSupport \ -XX:InitialRAMPercentage25.0 -XX:MaxRAMPercentage50.0 ​ EXPOSE 8080 ENTRYPOINT [sh, -c, java $JAVA_OPTS -jar app.jar]几个注意点addgroup/adduser创建非root用户安全问题USER app之后的文件权限要注意EXPOSE 只是文档作用实际端口映射在 docker-compose 里配docker-compose 配置services: app-gateway: image: aipdt-java:v17 container_name: gateway ports: - 8080:8080 volumes: - ./gateway.jar:/app/app.jar - ./logs/gateway:/app/logs environment: - JAVA_OPTS-Xms128m -Xmx192m networks: - aipdt-cloud restart: unless-stopped ​ app-workflow: image: aipdt-java:v17 container_name: workflow ports: - 8897:8897 volumes: - ./workflow.jar:/app/app.jar - ./logs/workflow:/app/logs environment: - JAVA_OPTS-Xms128m -Xmx192m networks: - aipdt-cloud restart: unless-stopped ​ networks: aipdt-cloud: external: true配置外挂application.yml不同环境的差异通过Nacos配置中心管理镜像统一。踩过的坑1. alpine镜像DNS解析慢alpine默认用musl libcDNS解析行为跟glibc不同。有时服务间通过容器名通信会很慢。解决Java层面加-Djava.net.preferIPv4Stacktrue或者用openjdk:slim替代 alpine。2. Docker内存限制不等于JVM感知很多教程让你用docker run -m 400m限制容器内存然后JVM屁颠屁颠就适配了。不是的。必须加-XX:UseContainerSupportJava 10才有这个参数。如果没加JVM读到的是宿主机内存比如2G堆内存会设到500M然后超过容器的400M限制被Docker直接kill。3. 公网/内网端口不混用Docker容器间通信用内网container name外部访问才走宿主机端口。不要把数据库端口暴露到公网配置里只开放应用端口。总结低配服务器跑DockerJVM堆内存128-192M够用别用默认JVM参数手动配堆、元空间、GC-XX:UseContainerSupport是Docker必备配置外挂、镜像统一多环境一致性靠Nacos我正用一个人AI模式做独立开发微信小程序面狮狮已上线欢迎体验。更多技术分享https://gitee.com/yao113088/jiguang-dev

相关新闻

.NET日志框架核心原理与性能优化实践

.NET日志框架核心原理与性能优化实践

1. .NET日志框架的核心价值与诊断意义日志系统在.NET生态中扮演着系统"黑匣子"的角色,就像飞机上的飞行记录仪。我在处理线上事故时,90%的故障定位都依赖于良好的日志记录。一个典型的电商系统每天产生约2GB的日志数据,但真正有价值…

2026/11/3 2:17:25 阅读更多 →
GEO行业发展趋势:AI时代内容优化的未来

GEO行业发展趋势:AI时代内容优化的未来

随着生成式AI全面渗透搜索、问答、资讯、科普等场景,传统搜索引擎的流量占比持续下降,AI问答、智能检索成为用户获取信息的主流方式,GEO也从小众技术,逐渐成为数字化内容领域的核心刚需。第一个核心趋势:GEO全面替代传…

2026/11/1 0:06:12 阅读更多 →
AI 自动化工具 OpenClaw 完整安装文档,无需手动配置运行环境(含安装包)

AI 自动化工具 OpenClaw 完整安装文档,无需手动配置运行环境(含安装包)

OpenClaw 桌面自动化工具部署教程|图形化安装简化环境搭建 兼容系统:Windows10/11 64 位、macOS Windows 程序版本:v2.9.0 macOS 程序版本:v2.7.9 工具部署特点 OpenClaw 配备图形化安装程序,全程依托可视化界面操作…

2026/10/27 21:11:44 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/3 1:09:25 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/2 10:46:11 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/2 10:47:40 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/2 1:16:51 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/2 10:46:31 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/2 10:46:26 阅读更多 →

日新闻

周新闻

月新闻