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=192mMaxDirectMemorySize=96m 封顶防失控;ReservedCodeCacheSize=64m 从默认 240m 降到 64m。

实测 RSS 仍在 500MB 左右,但这套参数封住了所有可膨胀的 native 内存区域,长期运行不会因为 Metaspace 或 DirectMemory 无上限而持续增长。

还想往下压的三条路(超出 JVM 调参范畴)

  1. startup.sh -m standalone -f naming 只跑服务发现,跳过配置中心,实测 RSS 降到 485MB,省 50MB,代价是 config 不可用。
  2. 换 JDK 17,metaspace 管理更高效,预计省 30-50MB。
  3. 外接 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,不值得折腾稳定性。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注