JavaScript中对象生命周期与垃圾回收的引用关系
“可达”对象指从根对象如全局对象、调用栈出发沿引用链能遍历到的对象“不可达”对象则无法被遍历到GC仅回收后者全局变量始终可达局部对象在无外部引用时变为不可达闭包、未解绑事件监听器、定时器、Map/Set未清理等易致内存泄漏应设null、移除监听器、清理定时器、使用WeakMap/WeakRef可通过堆快照、console.memory、window.gc()调试验证。JavaScript中对象的生命周期由引用关系决定垃圾回收器GC只回收那些不再被任何活跃引用指向的对象。理解引用如何建立、维持和断开是掌握内存管理的关键。什么是“可达”与“不可达”对象引擎从一组根对象如全局对象、当前执行函数的局部变量、调用栈中的值出发沿着引用链向下搜索。所有能被遍历到的对象称为“可达”其余为“不可达”。GC只会清理不可达对象。全局变量始终可达除非显式赋值为null或重新声明 函数内部定义的局部对象在函数返回后若无外部引用如闭包捕获、事件监听器保存即变为不可达 DOM节点即使从文档中移除只要JS变量仍持有其引用就依然可达常见导致意外内存泄漏的引用场景并非所有引用都显而易见以下情况容易让对象持续“存活”闭包隐式保留引用内嵌函数访问外层函数变量时整个外层作用域对象可能被长期持留 事件监听器未解绑绑定到DOM元素的回调函数若引用了大对象如缓存数据、整个组件实例该对象无法被回收 定时器中的this绑定使用setInterval且回调内引用了实例属性即使组件已销毁定时器仍在运行并阻止回收 Map/Set等集合未清理将对象作为键存入Map后忘记删除即使原引用消失Map仍持有强引用如何主动管理引用以协助GCJavaScript不提供手动释放内存的API但可通过控制引用显式“断开连接” 橙篇 百度文库发布的一款综合性AI创作工具
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2510885.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!