介绍
内存指标定义
- 空载RSS:服务启动完成、无任何请求的常驻内存(生产最有参考价值)
- 压测稳态RSS:持续并发请求稳定后的内存
- 区分两大模式:JVM解释运行 / GraalVM Native原生镜像(Java系专属)
测试基准
极简HelloWorld单接口,无数据库/中间件复杂依赖,2026主流稳定版本:
- SpringBoot 3.3(JDK21)
- Quarkus 3.15
- NestJS 10(Node20)
- FastAPI 0.110(Python3.11)
- Gin 1.9(Go1.23)
空载内存RSS数据
单位MB,由低到高排序
1. Gin(Go,原生编译二进制,无虚拟机)
- 空载:20–35MB
- 压测稳态:60–110MB
- 原理:Go静态编译、轻量Goroutine、极简运行时,无VM层开销;协程内存远小于JVM/Node线程
2. Quarkus Native(GraalVM原生镜像)
- 空载:20–55MB
- 压测稳态:50–90MB
- 优势:编译期完成Bean扫描、反射预处理,移除完整JVM,无JIT堆开销;云原生官方基准仅为SpringBoot JVM 1/3内存
3. FastAPI(Python异步uvicorn)
- 空载:45–70MB
- 压测稳态:90–180MB
- 特点:CPython解释器基础开销低,异步协程轻量;但高并发下Python GC会缓慢堆涨,长时间运行内存会持续爬升
4. NestJS(Node.js V8)
- 空载:60–140MB
- 压测稳态:150–350MB
- 特点:V8引擎基础开销高于Python;依赖多、装饰器反射会抬高基线;高并发长连接场景内存上涨明显,GC停顿突出
5. Quarkus JVM模式(普通Jar包运行)
- 空载:120–180MB
- 压测稳态:200–320MB
- 对比SpringBoot:构建时预初始化上下文,启动扫描开销大幅降低,内存比同配置SpringBoot少30%–50%
6. SpringBoot JVM(标准Jar,Tomcat默认)
- 空载:180–320MB(JDK21优化后下限150MB,JDK8普遍250MB+)
- 压测稳态:350–800MB(默认堆Xmx1G,业务复杂直接破1G)
- 痛点:运行时全量扫描Bean、大量反射缓存、完整JVM运行时、Tomcat线程池开销大
7. SpringBoot Native(GraalVM原生镜像)
- 空载:80–140MB
- 压测稳态:120–200MB
- 对比Quarkus Native:Spring生态大量动态特性导致原生镜像体积、内存高于Quarkus,改造复杂度更高
统一内存层级排序
空载基线,按3个梯队归纳
T0 极致轻量(20–70MB,Serverless/高密度容器首选)
- Gin(20–35MB)
- Quarkus Native(20–55MB)
- FastAPI(45–70MB)
T1 中等轻量(60–180MB,中小微服务通用)
- NestJS(60–140MB)
- Quarkus JVM(120–180MB)
- SpringBoot Native(80–140MB)
T2 重内存(180MB起步,传统Java服务)
- SpringBoot JVM(180–320MB)
压测高并发下内存变化规律
- Gin:内存涨幅最小,并发10万连接仅翻倍,GC平滑无卡顿,长期运行内存稳定不泄漏
- Quarkus Native:几乎无堆膨胀,无JIT、无Full GC,内存曲线平直
- FastAPI:并发越高内存线性上涨,Python GIL限制,上万并发后内存持续累积,重启释放
- NestJS:V8堆持续扩张,内存上限由
--max-old-space-size控制,内存打满会出现长时间GC停顿 - SpringBoot JVM:堆占用随业务对象持续上涨,依赖G1/ZGC回收;不限制Xmx极易占用1G+内存
内存占用对比表
基础空载内存
极简HelloWorld,单位:MB RSS
| 框架 | 运行模式 | 空载常驻内存 | 并发稳态内存 | 内存梯队 |
|---|---|---|---|---|
| Gin 1.9(Go1.23) | 静态编译二进制 | 20–35 | 60–110 | T0 极轻量 |
| Quarkus 3.15 | GraalVM Native原生镜像 | 20–55 | 50–90 | T0 极轻量 |
| FastAPI 0.110 | Python3.11 + Uvicorn异步 | 45–70 | 90–180 | T0 极轻量 |
| SpringBoot 3.3 | GraalVM Native原生镜像 | 80–140 | 120–200 | T1 中等 |
| NestJS 10 | Node.js 20 | 60–140 | 150–350 | T1 中等 |
| Quarkus 3.15 | JVM Jar包(JDK21) | 120–180 | 200–320 | T1 中等 |
| SpringBoot 3.3 | 标准JVM Jar+Tomcat(JDK21) | 180–320 | 350–800+ | T2 高内存 |
内存特性横向对比表
| 框架 | 底层运行时 | 内存优势 | 内存短板 | GC/内存膨胀表现 |
|---|---|---|---|---|
| Gin | Go runtime,无虚拟机 | 静态编译无VM开销,Goroutine栈极小,基线最低 | 动态反射能力弱,序列化代码量大 | 内存增长平缓,无长时间GC停顿,长期稳定不泄漏 |
| Quarkus Native | GraalVM AOT,无完整JVM | 构建期预初始化Bean,移除JIT、反射缓存,内存极低 | 第三方库兼容差,动态代理、热更新受限 | 几乎无堆膨胀,无Full GC,曲线平直 |
| FastAPI | CPython + asyncio | 解释器基础开销低,协程轻量,开发便捷 | GIL限制并发,GC回收效率差 | 并发越高内存线性累积,长期运行持续涨内存 |
| NestJS | V8引擎(Node.js) | TS统一全栈,空载基线低于传统Spring | V8堆开销大,装饰器反射抬高常驻内存 | 高并发堆持续扩张,内存打满会出现长GC停顿 |
| Quarkus JVM | HotSpot JVM | 预扫描上下文,内存比SpringBoot少30%~50% | 仍存在JVM基础运行时开销 | 标准Java GC,堆随业务对象缓慢上涨 |
| SpringBoot Native | GraalVM AOT | 相比JVM模式内存大幅降低 | Spring生态大量动态特性导致镜像内存高于Quarkus Native | 无JIT,GC压力小,内存稳定 |
| SpringBoot JVM | HotSpot JVM + Tomcat | 生态完善,各类中间件适配成熟 | 运行时全量Bean扫描、大量反射缓存,基线最高 | 默认堆1G,不限制Xmx极易占用超大内存 |
生产部署选型内存参考表
| 业务场景 | 推荐框架 | 内存核心优势 |
|---|---|---|
| K8s高密度容器、Serverless、函数计算 | Gin / Quarkus Native | 单节点可部署更多实例,大幅降低云内存成本 |
| AI接口、轻量内部工具、快速开发 | FastAPI | 上手快,空载内存低 |
| 前后端统一TypeScript技术栈 | NestJS | 接受中等内存换取TS全栈统一 |
| 存量Java微服务轻量化改造 | Quarkus JVM | 改动小,内存直接减半 |
| 复杂企业业务、依赖大量Java中间件 | SpringBoot JVM | 生态完善,兼容性拉满 |
| 新建Java微服务、追求低资源消耗 | Quarkus Native | 原生镜像内存极低,启动速度快 |
各框架内存高/低核心根源
| 框架 | 内存优势原因 | 内存短板 |
|---|---|---|
| Gin | Go静态编译、无虚拟机、Goroutine极小栈、无反射运行时开销 | 动态能力弱,反射/序列化开发繁琐 |
| Quarkus Native | 构建时AOT预处理,移除JVM,无运行时Bean扫描,封闭世界静态分析 | 第三方库兼容性差,改造成本高,丢失部分动态特性 |
| FastAPI | Python解释器基础开销低,asyncio轻量协程 | CPython GC低效,高并发内存累积,CPU利用率一般 |
| NestJS | Node单进程基线低于标准SpringBoot,TS开发灵活 | V8堆开销大,大量装饰器反射抬高常驻内存 |
| SpringBoot JVM | 生态最强、成熟GC | JVM基础运行时+运行时动态扫描,堆内存天然庞大 |
生产场景选型内存参考建议
- K8s高密度部署、Serverless、函数计算:优先Gin / Quarkus Native,单节点可部署3–5倍实例,大幅降低云内存成本
- AI脚本、数据接口、简单内部工具:FastAPI,开发快、基线内存低
- 前端全栈、TypeScript统一技术栈:NestJS,接受中等内存换取TS全栈一致性
- 传统企业复杂业务、大量成熟Java中间件/框架:SpringBoot JVM;追求轻量化可升级SpringBoot Native
- 存量Java微服务轻量化改造:Quarkus JVM(改造小,内存减半),新项目直接Quarkus Native
补充
- 同等业务复杂度下,Gin ≈ Quarkus Native 内存最低,二者几乎持平;
- 所有Java框架开启GraalVM Native镜像后,内存直接降低50%–80%;
- SpringBoot JVM是五者中常驻内存最高的方案,容器部署必须手动限制
-Xmx; - 脚本语言(FastAPI/NestJS)空载内存表现尚可,但高并发长期运行内存膨胀问题显著,不如Go/原生Java稳定。