chrome devtools comparison视图通过对比两个内存快照识别未被回收的对象:先拍基准快照(页面加载后)和操作后快照,选后者并切换comparison模式;重点关注# delta(新增未回收对象数)和size delta(内存净增),优先筛选# delta持续为正的构造函数,再通过retainers查看持有链,结合containment验证全局引用路径。

直接用 Chrome DevTools 的 Comparison 视图就能清晰看出两次快照间的内存差异,关键不是看“谁大”,而是看“谁没被回收”。
选对两个快照再进入比较模式
先在 Memory 面板拍下至少两个快照:第一个建议在页面刚加载完、无任何交互时拍摄(基准快照);第二个在执行完可疑操作(比如打开又关闭一个弹窗、切换路由、反复渲染组件)后再拍。拍完后,在快照列表中点击第二个快照,然后从顶部视图下拉菜单里选择 Comparison,它会自动以第一个快照为参照进行比对。
重点关注 Delta 和 Size Delta 列
Comparison 表格里最核心的是两列:
- # Delta:对象数量的净变化。正数说明这类对象新增了但没被回收,比如反复绑定又没解绑的事件监听器,或缓存未清理的数组实例
- Size Delta:对应内存占用的净变化。即使对象数量没涨,单个对象变大(如闭包持有了大数组)也会在这里体现
优先筛选 # Delta 持续为正且数值较大的构造函数,例如 HTMLDivElement、VueComponent、Closure 或你自定义的类名。
结合 Retainers 查看谁在阻止释放
双击某一行高亮的对象类型(比如发现大量 EventListener),右侧会显示该类型实例的支配树(Dominators)或持有者链(Retainers)。这里能看到具体是哪个全局变量、闭包、或 DOM 节点还在引用它。常见线索包括:
- 某个闭包的
[[Scopes]]里保留着本该销毁的组件实例 -
window或document上挂了未清理的监听器 - 定时器回调里引用了已卸载组件的
this
配合 Containment 视图验证引用路径
如果 Comparison 找到可疑对象,切换到 Containment 视图,展开 Global → window 或 GC Roots,手动搜索该对象或其构造函数名。这样能看清它是如何从全局作用域被间接引用的,尤其适合排查意外的闭包捕获或模块级缓存滥用。











