讲师中心 微信公众号

工具推荐

视频效率加速
Laper
Laper

剧本策划到成片协作

updream

一键生成高质量推广成片

剧云
剧云

中文短剧剧本制作平台

AniShort
AniShort

AI短剧协同制作平台

什么是Javascript的垃圾回收机制_怎样避免Javascript中的内存泄漏?

陌静君_8443

陌静君_8443

发布时间:2025-12-31 14:53:50

|

608人浏览过

|

来源于php中文网

原创

JavaScript 垃圾回收靠可达性判断对象是否可回收,即从根对象出发标记所有可达对象,未被标记的不可达对象被清除;不依赖引用计数或变量名是否存在。

什么是javascript的垃圾回收机制_怎样避免javascript中的内存泄漏?

JavaScript 的垃圾回收机制靠什么判断对象可回收?

JavaScript 引擎(如 V8)主要用标记-清除(Mark-and-Sweep)机制自动回收内存,不依赖引用计数。它从一组根对象(如全局对象、当前执行上下文中的局部变量、活动函数参数等)出发,递归标记所有可达对象;未被标记的对象即被视为“不可达”,随后被清除。

关键点在于:可达性(reachability)才是决定是否回收的唯一标准,不是“有没有变量名指向它”。比如一个对象被闭包内部函数持有,即使外部变量已设为 null,它仍可达,不会被回收。

常见误判场景:

  • 以为 obj = null 就立刻释放内存 → 实际只是断开一个引用,若还有其他引用(如事件监听器、闭包、缓存 Map 中的 key)仍存在,对象继续存活
  • 认为定时器回调执行完就自动清理其捕获的变量 → 若回调是闭包,且被长期持有的 timer ID 引用(如未 clearInterval),整个作用域链可能滞留
  • 把 DOM 节点和 JS 对象混为一谈 → 移除 DOM 节点不等于解除 JS 引用;若仍有 JS 变量(如 const el = document.getElementById('x'))或事件监听器绑定着它,节点无法被 GC

哪些典型模式会引发内存泄漏?

内存泄漏本质是“本该被回收的对象因意外强引用而持续驻留”。以下是最常踩的坑:

立即学习“Java免费学习笔记(深入)”;

  • 未移除的事件监听器:给全局或长生命周期对象(如 window、document、单例模块)添加监听器,但组件卸载或逻辑结束时没调用 removeEventListener
  • 闭包中保留大对象引用:回调函数无意中捕获了大型数组、JSON 数据或 DOM 集合,且该回调被长期持有(如挂到定时器、Promise 链、或作为事件处理器未解绑)
  • 全局变量意外增长:忘记用 var/let/const 声明变量 → 自动挂到 window(浏览器)或 global(Node.js),例如 data = fetchData()
  • 定时器未清理:使用 setInterval 但忘记 clearInterval,尤其在 SPA 页面切换、React 组件卸载、Vue beforeUnmount 等时机
  • Map/Set 持有 DOM 节点作 key:如 cacheMap.set(domEl, data),DOM 节点被移除后,cacheMap 仍强引用它,阻止 GC;应改用 WeakMap(只接受对象作 key,且是弱引用)

如何用 WeakMap 和 WeakRef 主动降低引用强度?

WeakMap 和 WeakRef 是 ES2015+ 提供的、专为避免内存泄漏设计的工具。它们不阻止垃圾回收,适合做“附属元数据”存储。

优先选 WeakMap 的场景:

javascript-typescript-typescript-scaffold
javascript-typescript-typescript-scaffold

你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型

下载
  • 给 DOM 元素附加私有状态(如拖拽坐标、加载状态),又不想阻止元素被回收
  • 实现对象级缓存,key 是目标对象本身,value 是计算结果

示例:用 WeakMap 缓存 DOM 元素尺寸,无需手动清理

const sizeCache = new WeakMap();

function getCachedSize(el) {
  if (sizeCache.has(el)) {
    return sizeCache.get(el);
  }
  const size = { width: el.offsetWidth, height: el.offsetHeight };
  sizeCache.set(el, size);
  return size;
}

// el 被 remove() 后,sizeCache 中对应 entry 自动失效,无泄漏风险

WeakRef 更底层,适用于需要“尝试访问”一个可能已被回收的对象:

  • 缓存大型资源(如 canvas 上下文、WebGL 纹理),但允许 GC 在内存紧张时回收
  • 实现软引用式观察者模式(需配合 FinalizationRegistry 清理副作用)

注意:WeakRef 不适合常规业务逻辑,API 复杂且时机不可控,WeakMap 覆盖 90% 场景。

调试内存泄漏的实操步骤有哪些?

别猜,用 Chrome DevTools 的 Memory 面板直接观测。核心动作是“对比快照”:

  • 打开 DevTools → Memory → Take heap snapshot
  • 执行疑似泄漏的操作(如打开/关闭弹窗、切换路由、反复增删列表)
  • 再拍一张快照,用 Comparison 视图筛选 “Objects allocated between snapshots”
  • 重点关注 (closure)、HTMLDivElement、Array 等类型数量是否异常增长
  • 点击某构造函数,在右侧看“Retainers”列 → 找出谁在强引用它(常见是 Window、setInterval、闭包变量、事件监听器)

命令行辅助排查:

  • console.memory 查看当前 JS 堆大小(单位字节)
  • % gc(V8 内部命令,需开启 --allow-natives-syntax)强制触发 GC,验证是否真泄漏
  • Node.js 可用 process.memoryUsage() 监控 RSS 和 heapUsed

真正难的是识别“间接引用链”——比如一个 setTimeout 回调闭包里用了某个对象,而这个 timer 又被挂到了全局对象上。这种链路必须靠快照 Retainers 一层层点进去看,没法靠代码静态扫描发现。

热门AI工具

更多
讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2355

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3882

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1296

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4499

2025.09.10

chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

3006

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

6279

2023.11.06

Chrome开启无痕模式
Chrome开启无痕模式

本专题整合了Chrome无痕模式开启相关内容,阅读专题下面的文章了解更多详细教程。

4487

2026.03.24

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

569

2023.09.22

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

100

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app快速上手
uni-app快速上手

共0课时 | 0人学习

Vue 教程
Vue 教程

共42课时 | 17.5万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 2.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn