- 之前 → 之后
- 846 → 1451
- 差值
- +605
- 增量 / 迭代
- +121
查找内存泄漏
重复页面导航,检查返回初始页面后仍被保留的对象。查看浏览器中实际观测到的内存累积情况。
报告片段
查看哪个分组在迭代之间增长
页面跳转和返回的示例。数值用于解释报告,并非您网站的检测结果。
路由变化
/catalog → /product → /catalog × 5
跳转已结束,但上一页面的状态对象仍留在内存中,数量随每次重复操作增加。请检查哪些引用保留了这些对象。
Object 路由视图模型
Set<observerTarget>
- 之前 → 之后
- 34 → 74
- 差值
- +40
- 增量 / 迭代
- +8
原生内存
- 之前 → 之后
- 41.2 → 54.7 MB
- 差值
- +13.5 MB
- 增量 / 迭代
- +2.7 MB
用于说明报告的示例数据。您页面的实际结果将在检测后显示。
它是如何工作的
我们重复执行场景并统计各次运行之间的增量
场景
选择页面上的链接
扫描器查找最多三个可见的站内链接,将每次跳转和返回起始页面的操作重复五次。
差值
对比内存占用
预热后,测量重复导航结束时仍占用的内存,以发现首次加载时看不出的累积。
增长分组
显示累积的对象
报告列出不断增长的集合、事件监听器、DOM 节点和对象类型。若信息可用,还会显示修改集合的代码位置。
分析模块
内存泄漏报告包含哪些内容
场景
已检查的场景
报告会记录 URL、已检查的用户路径、迭代次数和泄漏标记,以便复现该发现。
泄漏URL迭代次数
差值
总内存增长
对同一导航过程比较总增长量和每次迭代的增长量。内存累积是检查保留对象的线索;有意设置的缓存和应用状态也可能持续占用内存。
总增量每次迭代内存统计
集合
Array, Map, Set, Object
增长的集合会单独列出:变化前后的大小、增量、每次迭代的增量,以及集合发生变化处的堆栈跟踪。
MapObject堆栈跟踪
监听器
事件监听器和节点
报告会显示场景前后的监听器数量、由此产生的增量,以及订阅增长时泄漏的监听器节点。
之前 / 之后节点增量每次迭代
DOM
DOM 节点增长
报告会显示 DOM 节点增长和泄漏节点的描述,从而更容易发现游离 DOM 或重复的界面初始化。
节点数量描述游离
堆对象
堆对象类型
对于增长的对象类型,报告包含数量增量、大小增量、保留大小增量以及每次迭代的值。当存在环境数据时,会分别显示 total、native 和 V8 heap。
数量增量大小增量保留
常见问题
关于内存泄漏的常见问题
关于每次迭代增量、不断增长的集合、监听器、DOM 节点以及报告之后该怎么做的简短解答。
内存增长一定是泄漏吗?
不一定。应用可能会保留仍需使用的数据。扫描器查找重复导航时的累积,但无法判断应用需要哪些数据。请检查对象为何被保留,以及返回后是否应释放。
什么是分离的DOM节点?
这是已从文档中移除,但仍因 JavaScript 引用而留在内存中的元素。例如,已关闭对话框的元素可能仍被引用。节点描述可缩小查找范围,具体保留原因仍需检查代码。
检查能发现事件监听器泄漏吗?
可以。报告会显示监听器前后的数量、总增量、每次迭代增量,以及带节点数量增量的泄漏监听器节点。这有助于区分一次性订阅与每次重复时添加的处理器。
扫描器检查哪些页面和操作?
此检查面向无需整页重新加载即可导航的 SPA。扫描器选择最多三个可见站内链接,重复跳转和返回。表单、搜索和打开对话框不会单独检查。若没有合适的链接,检查会失败,这并不表示没有内存泄漏。
发现泄漏后我该怎么做?
重复报告中的导航。如果每次返回后监听器数量都在增加,请找到组件添加监听器的位置,并确认清理逻辑是否执行。调查保留引用,不要仅依赖 leak 标记。修复后使用相同路径和迭代次数进行对比。