You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Node.js的Buffer仅在填充时占用内存而非分配时?

为什么Buffer.alloc分配5GB后内存不占用,fill后才占满?

这本质是**操作系统写时复制(Copy-On-Write, COW)**和Node.js Buffer底层实现共同作用的结果,具体拆解:

  • Buffer.alloc的零页共享机制
    当你调用Buffer.alloc(5_000_000_000)时,Node.js会向操作系统申请5GB的虚拟内存,但操作系统不会立刻分配对应物理内存。因为Buffer.alloc默认会把Buffer初始化为0,而操作系统有**零页(zero page)**优化:所有需要初始化为0的内存区域,都会被映射到同一个只读的零页,多个进程可共享这部分内存,无需为每个进程单独分配物理内存。此时任务管理器显示的只是虚拟内存预留量,并非实际物理内存占用。

  • fill操作触发写时复制
    当调用buf.fill(0x22)修改Buffer内容时,操作系统发现你要对只读的共享零页执行写操作,就会为这段Buffer分配真正的5GB物理内存,把零页内容复制到新物理内存后允许修改。这时候进程的物理内存占用会立刻涨到5GB,因为你真正占用了对应物理空间。

实验代码验证

代码1(未填充)

import { Buffer } from "buffer";

// 分配大小为5GB的Buffer
const buf = Buffer.alloc(5_000_000_000);

setInterval(() => {
  // 等待以在任务管理器中监控内存变化
}, 5000);

代码2(填充后)

import { Buffer } from "buffer";

// 分配大小为5GB的Buffer
const buf = Buffer.alloc(5_000_000_000);

setInterval(() => {
  // 等待以在任务管理器中监控内存变化

  // 填充Buffer
  buf.fill(0x22);
}, 5000);

内容的提问来源于stack exchange,提问作者Nadjib Brinis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:40:02