Nacos 2.5.2 在 macOS M1 上的内存下限实测:500MB 降不动
Nacos 2.5.2 standalone 模式默认只设了堆 -Xms64m -Xmx128m,Metaspace 和 DirectMemory 完全没上限,实际 RSS 在 500MB 左右。想压更低,试了一圈,结论是:500MB 基本是硬下限。
踩过的坑
试过把堆降到 96m,运行 70 秒后 OOM 退出,没有 heapdump,静默挂掉。试过把线程栈压到 192k,JDK 11 在 macOS arm64 上直接拒绝启动——最低 208k。试过 Metaspace 上限设 128m,启动到 Derby 加载阶段就挂,因为 Nacos 光启动就要 140-150MB 的类元数据。
用 NMT 拆解 RSS 构成
开启 -XX:NativeMemoryTracking=summary 后用 jcmd VM.native_memory summary 逐项看,500MB 的去向很清楚:
| 区域 | 占用 | 说明 |
|---|---|---|
| Metaspace | 93MB | 16351 个类,Nacos 体积决定的硬需求 |
| Java Heap | 123MB | Xmx 128m 几乎满,96m 运行时不够 |
| 线程栈 | 67MB | 227 个线程,macOS 强制 208k/线程下限 |
| Symbol 表 | 19MB | 类加载的副产品,不可调 |
| Code Cache | 28MB | JIT 编译代码 |
| Direct Memory | ~70MB | gRPC/Netty 堆外内存 |
| JVM 自身 + 共享库 | ~50MB |
几乎全是 native 内存,JVM 参数设上限只能防止失控,降不了实际占用。
最终配置
startup.sh 第 95 行 standalone 分支改为:
JAVA_OPT="${JAVA_OPT} ${CUSTOM_NACOS_MEMORY:- -Xms64m -Xmx128m -Xmn32m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=192m -XX:MaxDirectMemorySize=96m -XX:+UseSerialGC -Xss256k -XX:ReservedCodeCacheSize=64m}"
每一项的作用:-XX:+UseSerialGC 替掉 G1GC 省 GC 元数据;-Xss256k 从默认 1m 砍到 1/4;MaxMetaspaceSize=192m 和 MaxDirectMemorySize=96m 封顶防失控;ReservedCodeCacheSize=64m 从默认 240m 降到 64m。
实测 RSS 仍在 500MB 左右,但这套参数封住了所有可膨胀的 native 内存区域,长期运行不会因为 Metaspace 或 DirectMemory 无上限而持续增长。
还想往下压的三条路(超出 JVM 调参范畴)
startup.sh -m standalone -f naming只跑服务发现,跳过配置中心,实测 RSS 降到 485MB,省 50MB,代价是 config 不可用。- 换 JDK 17,metaspace 管理更高效,预计省 30-50MB。
- 外接 MySQL 替代内嵌 Derby,省掉 Raft/嵌入式存储的堆内开销。
底线:Nacos 这种 Spring Boot 重应用,光 JVM 自身结构 + 类元数据 + gRPC 堆外就要 400MB+,这是物理约束。想突破 500MB 得从减少加载模块入手,不是调参能解决的。
另一台电脑复刻步骤
1. 备份原文件
cp nacos/bin/startup.sh nacos/bin/startup.sh.bak
2. 改 standalone 分支
编辑 nacos/bin/startup.sh,找到第 95 行(standalone 分支):
# 原始(只有堆)
JAVA_OPT="${JAVA_OPT} ${CUSTOM_NACOS_MEMORY:- -Xms64m -Xmx128m -Xmn32m}"
# 改为
JAVA_OPT="${JAVA_OPT} ${CUSTOM_NACOS_MEMORY:- -Xms64m -Xmx128m -Xmn32m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=192m -XX:MaxDirectMemorySize=96m -XX:+UseSerialGC -Xss256k -XX:ReservedCodeCacheSize=64m}"
只改 standalone 那行,集群分支(第 101 行)不动。
3. 重启验证
sh nacos/bin/shutdown.sh
sh nacos/bin/startup.sh -m standalone
# 等 1 分钟,确认 HTTP 200
curl -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8848/nacos/
4. 如果另一台不是 M1 而是 Intel Mac
参数完全一样,但线程栈下限不同,Intel 上 -Xss256k 可以更低。如果还想压,试 -Xss208k,不过省不了多少。
5. 如果另一台是 Linux/Windows
-Xss256k 可能可以降到更激进(某些 Linux 平台最低 160k),但也省不了几 MB,不值得折腾稳定性。




