0

0

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

夜晨

夜晨

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

|

478人浏览过

|

来源于php中文网

原创

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

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

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

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

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

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

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

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

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

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

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

Otter.ai
Otter.ai

一个自动的会议记录和笔记工具,会议内容生成和实时转录

下载

立即学习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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

1064

2023.08.11

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

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

843

2023.11.06

chrome什么意思
chrome什么意思

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

1064

2023.08.11

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

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

843

2023.11.06

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

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

254

2023.09.22

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

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

1089

2024.03.01

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

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

97

2025.09.18

python 全局变量
python 全局变量

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

106

2025.09.18

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6.1万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号