bigywater.tech
Spring · 167

Spring Boot 最少要多少内存:-Xmx 压到多低还能启动

Spring Boot 应用最少给多少内存才能启动?把 -Xmx 压到很小,进程常驻内存会不会跟着变小?G1 与 SerialGC 有区别吗?这篇在 Spring Boot 4.0.8 上把堆从 6 MB 逐步加到 256 MB 实测。

10 MB
只有 starter-web 的最小应用能启动的最小 -Xmx(6 MB 与 8 MB 都是 OutOfMemoryError)
147 MB
-Xmx10m 时进程的常驻内存(G1),堆压得再小,进程仍然有 147 MB
20 MB
加上 JPA 与 H2 后能启动的最小 -Xmx(16 MB 失败)

最小应用

实测 · 本机执行输出
  默认(G1)   -Xmx  6m:失败(OutOfMemoryError:Java heap spaceException in thread "main" java.lang.OutOfMem)
  默认(G1)   -Xmx  8m:失败(OutOfMemoryError:Java heap space)
  默认(G1)   -Xmx 10m:启动成功,启动 1298 ms,RSS 147 MB,发 300 个请求之后 RSS 153 MB
  默认(G1)   -Xmx 12m:启动成功,启动 1563 ms,RSS 150 MB,发 300 个请求之后 RSS 155 MB
  默认(G1)   -Xmx 16m:启动成功,启动 1027 ms,RSS 133 MB,发 300 个请求之后 RSS 137 MB
  默认(G1)   -Xmx 32m:启动成功,启动 1040 ms,RSS 168 MB,发 300 个请求之后 RSS 173 MB
  默认(G1)   -Xmx 64m:启动成功,启动 1127 ms,RSS 184 MB,发 300 个请求之后 RSS 189 MB
  默认(G1)   -Xmx128m:启动成功,启动 862 ms,RSS 200 MB,发 300 个请求之后 RSS 216 MB
  SerialGC -Xmx  6m:失败(OutOfMemoryError:Java heap space)
  SerialGC -Xmx  8m:失败(OutOfMemoryError:Java heap space)
  SerialGC -Xmx 10m:启动成功,启动 1200 ms,RSS 148 MB,发 300 个请求之后 RSS 152 MB
  SerialGC -Xmx 12m:启动成功,启动 1084 ms,RSS 144 MB,发 300 个请求之后 RSS 148 MB
  SerialGC -Xmx 16m:启动成功,启动 1452 ms,RSS 139 MB,发 300 个请求之后 RSS 144 MB
  SerialGC -Xmx 32m:启动成功,启动 1132 ms,RSS 166 MB,发 300 个请求之后 RSS 172 MB
  SerialGC -Xmx 64m:启动成功,启动 1079 ms,RSS 171 MB,发 300 个请求之后 RSS 177 MB
  SerialGC -Xmx128m:启动成功,启动 976 ms,RSS 179 MB,发 300 个请求之后 RSS 184 MB

-Xmx10m 能启动;RSS 并没有随堆变小。

加 JPA

实测 · 本机执行输出
  默认(G1)   -Xmx 16m:失败(OutOfMemoryError:Java heap spaceException in thread "main" java.lang.OutOfMem)
  默认(G1)   -Xmx 20m:启动成功,启动 3197 ms,RSS 227 MB,发 300 个请求之后 RSS 229 MB
  默认(G1)   -Xmx 24m:启动成功,启动 2970 ms,RSS 234 MB,发 300 个请求之后 RSS 240 MB
  默认(G1)   -Xmx 32m:启动成功,启动 2231 ms,RSS 256 MB,发 300 个请求之后 RSS 261 MB
  默认(G1)   -Xmx 64m:启动成功,启动 1938 ms,RSS 262 MB,发 300 个请求之后 RSS 268 MB
  默认(G1)   -Xmx128m:启动成功,启动 2061 ms,RSS 304 MB,发 300 个请求之后 RSS 309 MB
  默认(G1)   -Xmx256m:启动成功,启动 2330 ms,RSS 328 MB,发 300 个请求之后 RSS 334 MB
  SerialGC -Xmx 16m:失败(OutOfMemoryError:Java heap space)
  SerialGC -Xmx 20m:启动成功,启动 3853 ms,RSS 220 MB,发 300 个请求之后 RSS 220 MB
  SerialGC -Xmx 24m:启动成功,启动 4223 ms,RSS 236 MB,发 300 个请求之后 RSS 242 MB
  SerialGC -Xmx 32m:启动成功,启动 2291 ms,RSS 248 MB,发 300 个请求之后 RSS 253 MB
  SerialGC -Xmx 64m:启动成功,启动 2444 ms,RSS 268 MB,发 300 个请求之后 RSS 276 MB
  SerialGC -Xmx128m:启动成功,启动 2382 ms,RSS 271 MB,发 300 个请求之后 RSS 277 MB
  SerialGC -Xmx256m:启动成功,启动 2282 ms,RSS 324 MB,发 300 个请求之后 RSS 330 MB

-Xmx20m 能启动;小堆时启动明显变慢。

分步演示

内存
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / OpenJDK 21.0.12(Homebrew) / Spring Boot 4.0.8(Spring Framework 7.0.9、Tomcat 11.0.24) / Spring Cloud 2025.1.3;用 javac 编译、java 直接运行,依赖由 Maven 从 Maven Central 解析;数字每次运行会有小幅抖动(Spring Boot 4.0.8,JDK 21;每个组合起一个独立的 JVM,-Xmx 与 -Xms 设成同一个值;等端口可连接后记录启动耗时与用 ps 读到的 RSS,再发 300 个 GET /hello 后再读一次;每个组合只跑了一次;应用一是只有 starter-web,应用二是 starter-web、starter-data-jpa、H2 内存库与一个实体)
    • 没有验证:每个组合多次重复的波动(启动耗时的差异可能有一部分是波动);真实业务负载下的最小堆(这里只发了 300 个简单请求);-XX:MaxMetaspaceSize、-Xss、-XX:ReservedCodeCacheSize 等非堆参数对 RSS 的影响;容器里 cgroup 内存限制下的行为;G1 与 SerialGC 之外的其他收集器;GraalVM native image 与 AppCDS 的内存;启动时间随堆变化的原因(推测与 GC 频率有关,没有验证)
    京ICP备2026067502号-1京公网安备11010502063487号