通过三张快照对比可定位内存泄漏:Baseline后执行操作拍第二张,重复后拍第三张;在Comparison视图中以第一张为参照,重点关注#New−#Deleted为正的对象、Detached DOM及Retained Size大且Distance小的实例,并检查Retainers中的全局变量、未清除定时器、事件监听器、闭包引用和Map/Set残留。

直接拍三张快照,用 Comparison 视图看谁“只进不出”。
先拍三张有逻辑关系的快照
- 第一张:页面加载完成、空闲稳定后立即拍(Baseline)
- 第二张:执行一次疑似泄漏的操作(比如打开弹窗、切换路由、渲染列表)后拍
- 第三张:重复同样操作 2–3 次后再拍(确认是否持续累积)
切换到 Comparison 视图比对增长对象
选中第三张快照 → 右上角下拉菜单选 Comparison → 左侧参照设为第一张快照。重点关注:
- Constructor 列中 # New − # Deleted 值明显为正的对象(如 Closure、Array、Modal、Chart、Map)
- Detached DOM tree 条目持续出现(说明 DOM 节点已移除但 JS 还强引用着)
- Retained Size 大且 Distance 小的实例(离 GC 根近,回收阻力大)
点开可疑构造函数,逐层展开看实例
- 找出几个典型新增实例 → 右侧面板切到 Retainers 标签
- 从顶部开始看谁在持有它:常见持有者包括
- window 或全局变量(比如漏声明的 data = [...])
- setInterval / setTimeout 回调闭包(组件卸载后定时器还在跑)
- 未解绑的事件监听器(如 document.addEventListener 后没 remove)
- 闭包作用域里意外捕获的大数组、DOM 节点或缓存对象
- Map/Set 中未清理的键值对(尤其用普通对象作 key 时)
配合小技巧提高效率
- 拍快照前手动触发一次垃圾回收(Memory 面板左上角垃圾桶图标),减少临时对象干扰
- 在 Comparison 中按 # New 降序排列,优先看顶部几行
- 如果看到大量匿名函数(
)或绑定函数(bound ),点开它的 Scope 查看闭包变量 - 对比第二张和第三张快照的 Delta,若某类对象数量翻倍,基本可锁定问题操作
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











