从3月8日之后的版本很难使用OpenClaw,会提示错误:

openclaw update

<— Last few GCs —>

[971442:0x893b000]    40625 ms: Mark-Compact 835.5 (840.9) -> 834.9 (846.4) MB, pooled: 0 MB, 2916.70 / 0.00 ms  (average mu = 0.291, current mu = 0.046) allocation failure; scavenge might not succeed
[971442:0x893b000]    43680 ms: Mark-Compact (reduce) 839.0 (846.4) -> 838.5 (842.7) MB, pooled: 0 MB, 2186.22 / 0.00 ms  (+ 313.2 ms in 0 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 2599 ms) (average mu = 0.239, cur

<— JS stacktrace —>

FATAL ERROR: Reached heap limit Allocation failed – JavaScript heap out of memory
—– Native stack trace —–

1: 0xe98a91 node::OOMErrorHandler(char const*, v8::OOMDetails const&) [openclaw]
2: 0x12a7710 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, v8::OOMDetails const&) [openclaw]
3: 0x12a7aac v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, v8::OOMDetails const&) [openclaw]
4: 0x150a9e5  [openclaw]
5: 0x151de12 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [openclaw]
6: 0x14f6912 v8::internal::HeapAllocator::AllocateRawWithLightRetrySlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [openclaw]
7: 0x14f6c48 v8::internal::HeapAllocator::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [openclaw]
8: 0x14cded0 v8::internal::Factory::NewFillerObject(int, v8::internal::AllocationAlignment, v8::internal::AllocationType, v8::internal::AllocationOrigin) [openclaw]
9: 0x194fefb v8::internal::Runtime_AllocateInYoungGeneration(int, unsigned long*, v8::internal::Isolate*) [openclaw]
10: 0x20b8276  [openclaw]

对于 2核2GB 的云主机来说,Node.js 默认的内存分配策略非常容易触碰上限。由于系统本身(Linux 内核、SSH 服务等)会占用约 300MB-500MB 的内存,留给 Node.js 的物理内存其实非常有限。

openclaw update 执行构建或编译任务时,内存占用会瞬间飙升,导致系统为了保护自己而强制结束进程。

1. 临时增加 Swap 分区(最推荐)

在 2G 内存的机器上跑 Node.js 更新,Swap(虚拟内存)是刚需。它能把硬盘当内存用,防止进程因 OOM (Out of Memory) 直接崩溃。

执行以下命令创建一个 2GB 的交换文件:

# 创建 2G 的 swap 文件
sudo fallocate -l 2G /swapfile
# 设置权限
sudo chmod 600 /swapfile
# 格式化为 swap 格式
sudo mkswap /swapfile
# 启用 swap
sudo swapon /swapfile

# 确认是否生效 (看到 Swap 那行有数值即可)
free -h

2. 限制 Node.js 内存上限

即便有了 Swap,也建议给 Node.js 一个明确的限制,建议设置为 1536MB(1.5G),预留 512MB 给系统内核:

export NODE_OPTIONS=”–max-old-space-size=1536″
openclaw update

3. 停止其他占用内存的服务

在更新期间,建议暂时关闭不必要的进程(如数据库或其他占用内存的 Docker 容器),等更新完再开启:

# 查看内存占用前三的进程,确认是否有可以暂时关闭的
ps aux –sort=-%mem | head -n 4

总结建议

2G 内存的配置,执行方案 1是比较合理的解决方案。如果不开启 Swap,即便你设置了 max-old-space-size,由于物理内存确实不足,更新过程中极大概率会导致整个系统甚至 SSH 连接直接卡死。

更新完成后,如果不想一直占用硬盘空间,可以用 sudo swapoff /swapfile 关闭它


Avatar photo
Harrie

我是王岩,2010年为了扩展自己的事业,我成立了一家互联网公司:上海岩创网络科技有限公司,2011年加入宏路数据任技术总监,2017年成立动乂岩数据技术有限公司同时兼任动点科技CTO。现在我正在搭建团队,在大数据、人工智能和新媒体领域进行探索。我的联系方式是:手机:13918304704 微信: harriewang QQ:13689186 公司网站:node100.com 欢迎大家跟我交流和讨论。

所有文章