JavaScript 中最常用的垃圾回收算法是标记-清除(Mark-and-Sweep)。
示例:
let obj = {
name: 'Alice',
age: 30
};
obj = null; // 原对象被解除引用
在这个示例中,当 obj
被设置为 null
时,原来引用的对象就变成了不可访问对象,会在下一次垃圾回收时被回收。
这是另一种垃圾回收机制,通过跟踪每个对象的引用数来确定是否可以回收对象。每次引用增加时,引用计数加一;每次引用减少时,引用计数减一。当引用计数为零时,对象被回收。
示例:
function createCycle() {
const obj1 = {};
const obj2 = {};
obj1.reference = obj2;
obj2.reference = obj1; // 形成循环引用
}
createCycle(); // 由于循环引用,obj1 和 obj2 无法被回收
现代 JavaScript 引擎(如 V8 引擎)使用了更高级的垃圾回收机制,如增量标记、分代收集等,以提高性能和效率。
新生代的垃圾回收更频繁,老生代的垃圾回收较少。
示例:
let temporaryObj = { name: 'temp' }; // 临时对象存储在新生代
temporaryObj = null; // 很快被回收
将标记阶段分为多个小步骤,避免一次性标记导致的性能问题。
示例:
function heavyComputation() {
// 模拟重计算
for (let i = 0; i < 1000000; i++) {
const obj = { value: i };
}
}
heavyComputation(); // 增量标记提高性能,避免长时间停顿
垃圾回收是 JavaScript 的重要机制,它自动管理内存,避免了手动内存管理的复杂性。理解垃圾回收的基本原理和常见问题,可以帮助开发者编写更高效和内存友好的代码。通过合理的内存管理和优化,可以有效避免内存泄漏和性能问题。