47. JS 内存泄漏场景与排查 副本.md

查看飞书原文 ↗5,158 字符

1. 核心概念 (Core Concept)

JavaScript 内存泄漏是指由于程序逻辑错误,那些本应被垃圾回收机制回收的对象仍被保留在内存中,无法释放,导致内存占用不断增长直到耗尽可用内存,影响应用性能甚至导致崩溃的现象。

2. 为什么需要它? (The "Why")

3. API 与用法 (API & Usage)

JavaScript 的内存管理是自动进行的,主要依赖垃圾回收机制(Garbage Collection, GC)。GC 的核心任务是找出不再被引用的对象并 K 释放其占用的内存。现代 V8 引擎采用分代垃圾回收(Generation Scavenging)和标记-清除(Mark-Sweep)/标记-整理(Mark-Compact)等多种算法。

尽管 GC 是自动的,但某些编程模式会“欺骗”GC,使其误以为某个对象仍然被需要,从而导致泄漏。以下是常见的内存泄漏场景及概念:

内存泄漏排查工具: 浏览器开发者工具(如 Chrome DevTools)是排查内存泄漏的主要工具。

排查步骤示例 (使用 Chrome DevTools Heap Snapshot):

  1. 打开开发者工具,选择 Memory 面板。
  2. 执行一次可能导致泄漏的操作(例如,打开一个弹窗组件)。
  3. 拍摄第一个堆快照 (Take heap snapshot)。
  4. 执行一次与操作相反的操作(例如,关闭弹窗组件)。
  5. 强制执行垃圾回收 (Collect garbage)。
  6. 拍摄第二个堆快照。
  7. 在第二个快照中,选择 Comparison 视图,与第一个快照进行对比。
  8. 按 Delta 排序,查找数量或大小显著增加的对象,特别是那些“不可达”(Not reachable)的对象,这通常是泄漏的迹象。重点关注自定义对象、事件监听器、DOM 节点等。
  9. 点击可疑对象,查看其保留树 (Retainers),分析是哪个地方持有对该对象的引用,从而找到泄漏源头。

4. 关键注意事项 (Key Considerations)

5. 参考资料 (References)


原文链接与附件索引