0

0

JavaScript中的垃圾回收如何工作_内存管理有哪些策略

幻影之瞳

幻影之瞳

发布时间:2025-12-31 20:01:02

|

825人浏览过

|

来源于php中文网

原创

javascript垃圾回收由引擎自动执行,采用标记-清除算法处理循环引用;weakmap、weakref和finalizationregistry可辅助管理弱引用与清理逻辑;常见泄漏源于隐式强引用,需借助devtools分析保留路径。

javascript中的垃圾回收如何工作_内存管理有哪些策略

JavaScript 的垃圾回收不是你手动控制的,而是引擎自动运行的;它只回收「不再被引用」的对象,不会回收「还有变量指向它」的东西。哪怕你心里觉得“这数据没用了”,只要还存在隐式引用,就不会被收走。

标记-清除(Mark-and-Sweep)是主流实现方式

V8、SpiderMonkey、JavaScriptCore 等引擎都用这个基本策略:先标记所有「可访问」的对象(从全局对象、函数调用等根集出发遍历引用链),再清除所有未被标记的对象。

  • 它能正确处理循环引用——比如 a.ref = bb.ref = a,只要 ab 都不再被全局或栈中变量引用,整块内存就会被一并回收
  • 不依赖引用计数,所以避免了 IE6 时代因循环引用导致 DOM 对象无法释放的经典内存泄漏
  • 回收动作不是实时发生的,而是在内存压力上升或空闲时由引擎调度,因此你无法预测 delete 或赋值为 null 后内存何时真正释放

WeakMapWeakRef 是打破强引用的关键工具

它们允许你持有对象但不阻止 GC 回收——适合缓存、元数据绑定、事件监听器管理等场景。

Jaaz
Jaaz

开源的AI设计智能体

下载
  • WeakMap 的键必须是对象,且不阻止该对象被回收;一旦键被回收,对应条目自动消失
  • WeakRef(ES2021)让你拿到一个弱引用句柄,需调用 .deref() 才可能取到原对象;如果已被回收,.deref() 返回 undefined
  • 不能对 WeakRef 使用 === 判断是否相等,也不能用它做属性名或 Map 键
  • FinalizationRegistry 可注册回调,在对象被回收后触发清理逻辑(比如关闭底层资源),但不保证立即执行,也不保证一定执行

常见泄漏模式和应对方式

大多数内存问题不是 GC 失效,而是你不小心维持了本不该存在的引用。

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

  • 全局变量残留:window.cacheData = hugeArray —— 改成局部作用域或显式赋值 cacheData = null
  • 定时器未清除:setInterval(() => {...}, 1000) 中闭包捕获了大对象 → 清理时调用 clearInterval(id),并确保闭包不意外保留对外部作用域的引用
  • 事件监听器未解绑:使用 addEventListener 后忘记 removeEventListener,尤其在单页应用组件销毁时;推荐用 { once: true } 或用 AbortController 控制信号
  • 闭包中缓存 DOM 元素但未随元素移除而清理:改用 WeakMap 关联状态,或监听 DOMNodeRemoved(已废弃)/ 使用 MutationObserver
const cache = new WeakMap();
function decorateElement(el) {
  if (!cache.has(el)) {
    cache.set(el, { timestamp: Date.now(), computedStyle: getComputedStyle(el) });
  }
  return cache.get(el);
}
// el 被从 DOM 移除后,cache 中对应项会自动消失

真正难调试的从来不是「GC 没运行」,而是「你以为它该被回收,其实还挂着一根看不见的引用」——比如一个被闭包捕获的父级作用域,或者某个第三方库内部保存的回调数组。用 Chrome DevTools 的 Memory 面板拍堆快照,按「Retained Size」排序,点开「Retainers」看谁还在 hold 它,比猜要可靠得多。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

1053

2023.08.11

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

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

836

2023.11.06

chrome什么意思
chrome什么意思

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

1053

2023.08.11

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

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

836

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

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

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

93

2025.09.18

python 全局变量
python 全局变量

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

106

2025.09.18

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

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

精品课程

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

共58课时 | 5.9万人学习

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号