SpringBoot / Quarkus / NestJS / FastAPI / Gin 内存占用对比

介绍

内存指标定义

  • 空载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/高密度容器首选)

  1. Gin(20–35MB)
  2. Quarkus Native(20–55MB)
  3. FastAPI(45–70MB)

T1 中等轻量(60–180MB,中小微服务通用)

  1. NestJS(60–140MB)
  2. Quarkus JVM(120–180MB)
  3. SpringBoot Native(80–140MB)

T2 重内存(180MB起步,传统Java服务)

  1. SpringBoot JVM(180–320MB)

压测高并发下内存变化规律

  1. Gin:内存涨幅最小,并发10万连接仅翻倍,GC平滑无卡顿,长期运行内存稳定不泄漏
  2. Quarkus Native:几乎无堆膨胀,无JIT、无Full GC,内存曲线平直
  3. FastAPI:并发越高内存线性上涨,Python GIL限制,上万并发后内存持续累积,重启释放
  4. NestJS:V8堆持续扩张,内存上限由--max-old-space-size控制,内存打满会出现长时间GC停顿
  5. 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基础运行时+运行时动态扫描,堆内存天然庞大

生产场景选型内存参考建议

  1. K8s高密度部署、Serverless、函数计算:优先Gin / Quarkus Native,单节点可部署3–5倍实例,大幅降低云内存成本
  2. AI脚本、数据接口、简单内部工具:FastAPI,开发快、基线内存低
  3. 前端全栈、TypeScript统一技术栈:NestJS,接受中等内存换取TS全栈一致性
  4. 传统企业复杂业务、大量成熟Java中间件/框架:SpringBoot JVM;追求轻量化可升级SpringBoot Native
  5. 存量Java微服务轻量化改造:Quarkus JVM(改造小,内存减半),新项目直接Quarkus Native

补充

  1. 同等业务复杂度下,Gin ≈ Quarkus Native 内存最低,二者几乎持平;
  2. 所有Java框架开启GraalVM Native镜像后,内存直接降低50%–80%;
  3. SpringBoot JVM是五者中常驻内存最高的方案,容器部署必须手动限制-Xmx;
  4. 脚本语言(FastAPI/NestJS)空载内存表现尚可,但高并发长期运行内存膨胀问题显著,不如Go/原生Java稳定。

原文出处:/show_1GW3hgVhbRfT.html