讲师中心 微信公众号
AI工具推荐 视频效率加速

javascript中的垃圾回收机制如何工作_如何避免内存泄漏

酷丽小哥_6880

酷丽小哥_6880

发布时间:2025-12-15 16:59:34

|

478人浏览过

|

来源于php中文网

原创

JavaScript垃圾回收基于可达性判断对象是否可回收,通过标记清除算法周期性清理不可达对象;闭包、未解绑事件监听器等易引发内存泄漏,需及时断开引用或使用WeakMap等工具防范。

javascript中的垃圾回收机制如何工作_如何避免内存泄漏

JavaScript 的垃圾回收(GC)是自动运行的,不需要手动干预,但它的工作方式和你写的代码密切相关。理解它怎么“判断哪些该删”,以及“为什么有些明明不用了却删不掉”,就能避开大部分内存泄漏问题。

垃圾回收靠“可达性”来判断对象是否该清理

引擎不会看“你是不是记得这个变量”,而是看“从根节点(比如全局对象、当前函数的局部变量)出发,能不能顺着引用链找到它”。能找到的,就叫“可达”;找不到的,就是垃圾。

  • 根节点包括:全局对象(浏览器里是 windowglobalThis)、当前执行函数的局部变量、正在入栈的参数等
  • 只要一个对象被某个可达对象直接或间接引用着,它就不会被回收
  • 哪怕你写了 obj = null,也只是断开了这一个引用;如果还有别的地方存着对它的引用,它依然活得好好的

主流算法是标记清除(Mark-and-Sweep),不是引用计数

现代 JS 引擎(V8、SpiderMonkey 等)都用标记清除,因为它能正确处理循环引用——这是引用计数的老大难问题。

Miller CSV TSV JSON 数据处理器
Miller CSV TSV JSON 数据处理器

Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。

下载
  • 标记阶段:从根开始遍历所有能触达的对象,打上“活跃”标记
  • 清除阶段:把没被打标记的对象内存全部释放
  • 整个过程不是实时的,而是周期性触发(比如空闲时或内存快满时),所以延迟存在但可控

闭包本身不等于内存泄漏,但容易“锁住”不该留的数据

闭包会保留其外层函数的词法环境。如果这个环境里有大数组、DOM 节点、或你早就不用的配置对象,而闭包还活着,那整块环境都动不了。

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

  • 典型场景:事件监听器用了闭包,但 DOM 元素已被移除,监听器却没解绑
  • 常见写法:element.addEventListener('click', () => {...}) —— 这个箭头函数闭包可能长期持有 element 或其他大对象
  • 解决办法:用具名函数 + removeEventListener;或用 AbortController 自动清理

几个简单但关键的防泄漏习惯

  • 定时器或请求回调里引用了外部大对象?用完及时设为 null 或用局部变量承接
  • 全局变量少用,尤其缓存类对象(如 window.cacheData),记得适时清空
  • WeakMap 存“附属信息”:键是 DOM 或对象实例,值只在键还活着时有效,不阻止回收
  • 大数组或 ArrayBuffer 不再需要时,别只赋值 [],显式设为 null 更稳妥
  • 开发中打开 Chrome DevTools → Memory 面板,拍快照对比,找“Detached DOM tree”或持续增长的对象

基本上就这些。机制不复杂,但容易忽略引用链的隐含关系。写代码时多问一句:“这个闭包/监听器/缓存,到底要活多久?”答案往往就是内存是否健康的关键。

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
WorkBuddy

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

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

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

DeepSeek

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

讯飞绘文

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

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

更多
chrome什么意思
chrome什么意思

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

2446

2023.08.11

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

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

4299

2023.11.06

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

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

3087

2026.03.24

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

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

509

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1638

2024.03.01

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

3625

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

1490

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

179

2026.03.17

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

0

2026.09.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 11.9万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.5万人学习

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

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