1. 垃圾回收机制深度解析
作为一名长期奋战在前端性能优化一线的开发者,我深刻体会到理解垃圾回收(GC)机制的重要性。JavaScript作为一门自动内存管理的语言,其GC机制直接影响着应用的性能和稳定性。今天,我将结合多年实战经验,带大家彻底搞懂GC的工作原理和优化技巧。
1.1 GC基础工作原理
现代JavaScript引擎(如V8)采用标记-清除算法作为核心回收策略。这个算法分为两个阶段:
- 标记阶段:GC从根对象(全局对象、当前函数调用栈等)出发,遍历所有可达对象并打上标记
- 清除阶段:遍历堆内存,回收所有未被标记的对象所占用的空间
javascript复制// 示例:可达性分析
let user = { name: "John" }; // 对象被user引用,可达
user = null; // 引用断开,对象变为不可达
注意:现代引擎还会使用分代收集策略,将对象分为新生代和老生代,采用不同的回收频率和算法来优化性能。
1.2 引用类型与GC行为
JavaScript中的引用分为两种基本类型:
| 引用类型 | 特点 | GC行为 |
|---|---|---|
| 强引用 | 常规的对象引用 | 只要强引用存在,对象就不会被回收 |
| 弱引用 | 通过WeakMap/WeakSet建立 | 不影响GC决策,对象可能被回收 |
javascript复制// 强引用示例
const cache = new Map();
function storeData() {
const bigData = new Array(1000000).fill('x');
cache.set('key', bigData); // 建立强引用
}
// 即使bigData离开作用域,由于Map持有引用,不会被GC
// 弱引用示例
const weakCache = new WeakMap();
function storeWeakData() {
const data = { /* ... */ };
weakCache.set(data, 'metadata'); // 建立弱引用
}
// 当data没有其他引用时,可以被GC回收
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 内存泄漏实战分析
2.1 常见内存泄漏场景
在实际项目中,我遇到过多种导致内存泄漏的典型情况:
- 全局变量滥用
javascript复制// 反例
function init() {
leakedData = new Array(1000000); // 意外创建全局变量
}
// 正解
function init() {
cons
