JavaScript 使用自动垃圾回收机制来管理内存,开发者不需要手动释放对象占用的内存。以下是 JavaScript 对象垃圾回收的主要概念:
JavaScript 引擎通过以下两种主要算法进行垃圾回收:
// 循环引用示例
function problem() {
let objA = {};
let objB = {};
objA.someProperty = objB;
objB.anotherProperty = objA;
// 即使函数执行完毕,这两个对象依然互相引用
}
现代 JavaScript 引擎(如 V8)使用更复杂的策略:
分代回收:将内存分为新生代(Young Generation)和老生代(Old Generation)
增量标记:将标记过程分成多个小步骤,避免长时间阻塞主线程
空闲时间收集:利用程序空闲时间进行垃圾回收
尽管有自动垃圾回收,仍可能出现内存泄漏:
意外的全局变量
function leak() {
leakedVar = '这是一个全局变量'; // 没有使用 var/let/const
}
遗忘的定时器或回调
let data = getHugeData();
setInterval(() => {
const node = document.getElementById('Node');
if(node) {
node.innerHTML = JSON.stringify(data);
}
}, 1000);
DOM 引用
let elements = {
button: document.getElementById('button'),
image: document.getElementById('image')
};
function removeButton() {
document.body.removeChild(elements.button);
// elements.button 仍然引用着 DOM 元素
}
闭包
function outer() {
let largeData = new Array(1000000).fill('*');
return function inner() {
// 即使 outer 执行完毕,largeData 仍被 inner 引用
};
}
现代开发者工具(如 Chrome DevTools)提供了内存分析工具,可以帮助检测内存泄漏问题。