performance.memory 返回对象含三个关键字段:totaljsheapsize(已分配总堆内存)、usedjsheapsize(实际占用堆内存)、jsheapsizelimit(v8动态计算的堆内存软上限)。

performance.memory 是 Chrome、Edge(基于 Chromium)等浏览器提供的非标准但广泛支持的接口,用于获取当前页面 JavaScript 堆内存的实时使用情况。它不能直接给出“堆内存限制”的精确值(如 V8 的硬性上限),但能提供三个关键字段,帮助你估算内存压力和识别潜在泄漏。
memory 对象包含哪些关键字段?
调用 performance.memory 返回一个对象,主要含以下三项:
- totalJSHeapSize:V8 引擎当前为该页面分配的总堆内存(字节),包含已用和空闲空间;
- usedJSHeapSize:当前实际被 JS 对象占用的堆内存(字节),即“已用堆”;
- jsHeapSizeLimit:V8 尝试维持的堆内存上限(字节),接近但不等于进程级硬限制(如 2GB/4GB),受设备内存、Chrome 启动参数、页面活跃度等影响。
如何安全、有效地获取快照?
直接访问即可,无需权限或初始化:
if (performance.memory) {
const mem = performance.memory;
console.log({
used: Math.round(mem.usedJSHeapSize / 1048576 * 100) / 100 + ' MB',
total: Math.round(mem.totalJSHeapSize / 1048576 * 100) / 100 + ' MB',
limit: Math.round(mem.jsHeapSizeLimit / 1048576 * 100) / 100 + ' MB',
usageRatio: (mem.usedJSHeapSize / mem.jsHeapSizeLimit).toFixed(3)
});
}
注意:Safari 和 Firefox 不支持 performance.memory,需做兼容判断;Node.js 环境也不可用。
如何理解 jsHeapSizeLimit 这个“限制”?
它不是操作系统级固定值,而是 V8 动态计算的软性启发式上限,受以下因素影响:
- 设备总内存大小(例如低内存 Android 设备可能仅 512MB);
- 当前标签页是否处于后台(后台页会主动降低 limit);
- Chrome 启动时是否启用
--js-flags="--max-old-space-size=2048"类参数; - V8 内存回收策略调整(如 Scavenger/Mark-Sweep 阶段变化)。
因此,同一页面在不同设备或不同时间刷新后,jsHeapSizeLimit 可能波动数百 MB。
实用建议:别只看单次快照,要建立监控模式
单次读数意义有限,建议结合周期采样与阈值告警:
- 每 2–5 秒采集一次
usedJSHeapSize,绘制趋势图; - 当
usedJSHeapSize / jsHeapSizeLimit > 0.75持续 10 秒以上,提示内存压力高; - 配合
chrome://memory-internals或 DevTools 的 Memory 面板做堆快照比对,定位泄漏对象; - 避免在高频回调(如 requestAnimationFrame)中频繁读取,防止微性能开销累积。










