为何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
相关产品推荐
相关产品推荐

