所有文章
精选文章

排查内存泄漏:沿着引用,找到对象为何还活着

从 Google Chat 的排查案例出发,理解 Retainers 如何帮助定位长期运行网页中的内存保留问题。

原作者:Vatan Aggarwal and Thierno Thiam
来源:Chrome for Developers

阅读原文

先固定一个能重复的操作

Vatan Aggarwal 与 Thierno Thiam 介绍了使用 Chrome DevTools for agents 排查 Google Chat 内存问题的过程。文中的修复成果属于 Google 项目,不是本站或你的应用已获得的收益。先定义具体操作,以及操作结束后哪些对象理应释放。

别只看内存总量,要看引用关系

堆快照展示仍可达的对象;Retainers 区域列出指向当前选中对象的其他对象。下面的官方文档示例中,Item 实例通过 x 属性保留一个字符串。这是帮助理解界面的 DevTools 示例,不是 Google Chat 的生产快照。

Chrome DevTools 官方示例:选中字符串由 Item.x 保留。来源:Meggin Kearney、Sofia Emelianova,Chrome for Developers / Google;CC BY 4.0,原图未改动。不是 Google Chat 生产快照。
Chrome DevTools 官方示例:选中字符串由 Item.x 保留。来源:Meggin Kearney、Sofia Emelianova,Chrome for Developers / Google;CC BY 4.0,原图未改动。不是 Google Chat 生产快照。 图片来源

把发现变成可以验证的检查

比较操作前、执行目标操作后、撤销或关闭后的三个状态,重复同一流程看保留是否持续增长。沿引用路径判断对象是否应该存在,再决定修改位置。合理缓存、最终会清理但数量过多的监听器,都不能直接等同于泄漏。

相关智能体内存指南解释了三态采样方法。验证修复时保留同样操作与条件,结合本站 Bug 修复验证指南补足复现和回归证据;智能体的解释或一次变小的快照,都不足以证明问题解决。本站阅读了资料,未运行原文实验。

资料来源与延伸阅读

  1. How Google Chat fixed 30+ memory issues with Chrome DevTools for agents官方资料 · Vatan Aggarwal and Thierno Thiam
  2. Debug memory leaks with Chrome DevTools for agents官方资料 · Chrome for Developers / Google
  3. Record heap snapshots: The Retainers section官方资料 · Meggin Kearney and Sofia Emelianova
  4. Boloop: verify an AI-generated bug fix文章 · Tink