Deno 在 macOS 把 maxRSS 放大 1024 倍,核对峰值内存单位
Deno 曾直接返回 Apple 平台以字节表示的 ru_maxrss,造成 maxRSS 按 KiB 解读时放大。2.9.7 包含单位转换,监控端旧补偿需要同步检查。
把同一个应用从 Node 换到 Deno,macOS 上的峰值内存监控突然放大约 1024 倍,可以先核对 process.resourceUsage().maxRSS 的单位。数值很大,不一定意味着进程真的多分配了那么多内存。
import process from 'node:process';
console.log({ maxRSSKiB: process.resourceUsage().maxRSS });
这一字段按 Node 兼容接口应表示 KiB。macOS 和 iOS 的 getrusage 原生 ru_maxrss 却以字节提供,其他 Unix 平台常用 KiB。Deno 曾直接返回 Apple 平台的原值,使调用方继续按 KiB 解释时,显示量级放大。
如果程序的真实峰值接近 100 MiB,按 KiB 表示约为 102400,按字节表示则约为 104857600。这个算术对照用来检查单位,不是应用的实测内存值,也不能用来确认所有字段都受影响。
Deno 2.9.7 包含 Apple 平台的单位转换:该分支把 ru_maxrss 除以 1024,其他 Unix 分支保持原来的取值。更新实际部署的 Deno 后核对:
deno --version
重新采集同一工作负载的 maxRSS,然后检查仪表盘是否还保留了旧的补偿。若监控代码过去为避开错误又除了一次 1024,升级后继续补偿会把数据压小。历史记录也可能混用了两种单位,应保留运行时版本和转换方式,不把升级前后的曲线直接拼成连续量。
maxRSS 是峰值,不是“此刻还占用了多少内存”。观察垃圾回收后的当前用量,应检查对应的当前内存指标;回收之后峰值没有下降,本身不说明修复失败。process.memoryUsage().rss 采用的字段和单位也不同,不能把这一修补的除法套到它上面。
验收可以选择一段可重复的受控内存工作负载,并与系统工具提供的峰值数据对齐。明确两端的单位、采样范围及峰值定义,再比较量级;系统工具显示的当前 RSS 与运行时的历史峰值不要求相同。
若更新后数值仍异常,先排除监控端重复转换和读取了不同字段,再调查真实分配变化。这个修补只纠正 Apple 平台的兼容字段单位,不释放内存,也不能解决流或缓存保留对象造成的增长。


