跳转到内容

查找内存泄漏

重复页面导航,检查返回初始页面后仍被保留的对象。查看浏览器中实际观测到的内存累积情况。

报告片段

查看哪个分组在迭代之间增长

页面跳转和返回的示例。数值用于解释报告,并非您网站的检测结果。

路由变化

/catalog → /product → /catalog × 5

跳转已结束,但上一页面的状态对象仍留在内存中,数量随每次重复操作增加。请检查哪些引用保留了这些对象。

Object 路由视图模型
之前 → 之后
846 → 1451
差值
+605
增量 / 迭代
+121
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 标记。修复后使用相同路径和迭代次数进行对比。
Cookies

我们使用 Cookie

我们使用 Cookie 以在你的网站上为你提供更好的体验。你可以在我们的 隐私政策.