Chrome DevTools Memory面板用于观察垃圾回收效果、识别内存泄漏及理解对象生命周期;堆快照仅显示存活对象,需通过基准快照、操作、清理、强制GC、对比分析来捕获泄漏。

Chrome DevTools 的 Memory 面板不能“使用”垃圾回收,而是帮你观察垃圾回收是否生效、识别内存泄漏和理解对象生命周期。堆快照(Heap Snapshot)是静态快照,反映某一时刻 JS 堆中所有存活对象的状态——已不可达、等待被 GC 的对象不会出现在快照里。
如何捕获有意义的堆快照
堆快照只显示当前仍被引用的对象,所以关键在于控制操作流程,让可疑对象“本该被释放却依然存在”:
- 在执行某项功能前,先拍一张基准快照(Snapshot 1)
- 执行操作(比如打开弹窗、加载列表、切换路由)
- 主动触发清理(如关闭弹窗、清空数据、调用
dispose()方法) - 手动点击 Collect garbage(垃圾桶图标),强制运行一次 GC
- 再拍一张快照(Snapshot 2)
- 用 Comparison 视图对比两次快照,重点关注“新增”且“未释放”的对象
重点看哪些字段和筛选技巧
在快照的 Constructor 或 Retainers 视图中,关注以下信息:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Distance:数字越小,说明离根(GC root)越近,越难被回收(比如全局变量、事件监听器、闭包外层函数)
- Retained Size:该对象及其所有可达子对象占用的总内存,比 Shallow Size 更有分析价值
- Retainers 列表:右键对象 → “Reveal in Summary view” 或 “Show in Retainer Tree”,查看谁在持有它
- 常用筛选:
Filter: (regex) /Component|Modal|List/快速定位业务类;filter: "(array)"查数组;勾选 Show unreachable objects(需开启高级选项)可看到刚被 GC 回收的对象(仅限部分版本支持)
典型泄漏模式与验证方法
很多泄漏不是“没调 GC”,而是对象意外保活。常见情况:
立即学习“Java免费学习笔记(深入)”;
-
全局变量或闭包意外引用:检查
window、console、未清除的定时器回调、或被闭包捕获的大数组/缓存 -
事件监听器未解绑:查找
EventListener对应的 handler,看其闭包中是否持有 DOM 节点或组件实例 -
DOM 引用残留:搜索
Detached DOM tree,展开后看是否有 JS 对象(如 Vue 实例、React Fiber Node)仍在引用已移除的节点 -
Map/Set 缓存未清理:查找
Map或Set构造器,点开看 key/value 是否包含本该销毁的实例
配合 Performance 面板交叉验证
Memory 面板擅长“静态切片”,Performance 面板适合“动态追踪”:
- 录制一段用户操作(含打开→关闭→等待几秒),在 Memory 轨迹中观察 JS heap 曲线是否回落
- 若曲线持续攀升或不回落,说明有对象未释放;回落后再缓慢爬升,可能是缓存渐进增长
- 在 Performance 录制中勾选 Memory 和 JS Heap,可同步看到 GC 事件(标为
GC的紫色条)是否频繁发生、是否有效回收

















