浏览器通过自动内存管理机制回收不再使用的对象,防止内存泄漏。JavaScript引擎(如V8)负责跟踪内存分配,识别不再可达的对象并释放其内存。
window
、全局变量)出发,遍历所有可达对象并标记为“活动”。From
和To
空间,存活对象从From
复制到To
,清空From
。场景 | 问题描述 | 解决方案 |
---|---|---|
意外全局变量 | 未声明的变量挂载到window | 使用严格模式('use strict' ) |
未清理的定时器/事件 | 回调函数持有DOM引用 | 及时调用clearInterval /removeEventListener |
闭包引用 | 函数内部引用外部变量未释放 | 手动解除引用(如置为null ) |
游离的DOM引用 | 已移除的DOM节点被JS引用 | 清除DOM节点的所有引用 |
WeakMap
/WeakSet
管理缓存(弱引用不阻止垃圾回收)。Heap Snapshot
分析内存分布。performance.memory
(浏览器支持有限)。WeakMap
和Map
的区别?
WeakMap
键为弱引用,不阻止键对象被回收;Map
键为强引用。javascript
// 内存泄漏示例(未清理定时器)
function leak() {
const data = new Array(1000000).fill('*');
setInterval(() => {
console.log(data.length); // data一直被闭包引用
}, 1000);
}
// 修复:清理定时器
function fixLeak() {
const data = new Array(1000000).fill('*');
const timer = setInterval(() => {
console.log(data.length);
}, 1000);
// 在不需要时清理
setTimeout(() => clearInterval(timer), 5000);
}