跳到主要内容

查找未报告的内存泄漏

默认情况下,memlab 会报告高置信度的内存泄漏(由其内置的泄漏检测器过滤掉)。如果存在一些内存泄漏,但 memlab 没有报告这些泄漏,本教程将展示其他选项来显示可疑的堆对象。

让我们从运行以下命令开始。确保在场景文件中不指定任何泄漏过滤器。MemLab 将应用其内置的泄漏检测器,该检测器查找分离的 DOM 元素和未卸载的 React Fiber 节点。有时这可能无法检测到所有(或任何)内存泄漏。

memlab run --scenario ~/memlab/scenarios/unbound-object.js

现在让我们运行

memlab find-leaks --trace-all-objects

这将要求 memlab 将目标交互分配的每个对象都视为内存泄漏。在这种情况下,目标交互中有很多对象没有被释放。

memlab 会对泄漏对象的保留器跟踪进行聚类,并根据泄漏聚类的聚合保留大小按降序打印它们。

MemLab found 46 leak(s)
--Similar leaks in this run: 4--
--Retained size of leaked objects: 8.3MB--
[Window] (native) @35847 [8.3MB]
--20 (element)---> [InternalNode] (native) @130981728 [8.3MB]
--8 (element)---> [InternalNode] (native) @130980288 [8.3MB]
--1 (element)---> [EventListener] (native) @131009888 [8.3MB]
--1 (element)---> [V8EventListener] (native) @224808192 [8.3MB]
--1 (element)---> [eventHandler] (closure) @168079 [8.3MB]
--context (internal)---> [<function scope>] (object) @181905 [8.3MB]
--bigArray (variable)---> [Array] (object) @182925 [8.3MB]
--elements (internal)---> [(object elements)] (array) @182929 [8.3MB]


--Similar leaks in this run: 79--
--Retained size of leaked objects: 16.9KB--
[Window] (native) @35847 [8.3MB]
--17 (element)---> [InternalNode] (native) @224820352 [0 byte]
--3 (element)---> [InternalNode] (native) @224766112 [0 byte]
--1 (element)---> [InternalNode] (native) @224771072 [0 byte]
--1 (element)---> [InternalNode] (native) @224723840 [540 bytes]
--1 (element)---> [InternalNode] (native) @224723680 [540 bytes]
--1 (element)---> [InternalNode] (native) @224818752 [84 bytes]


--Similar leaks in this run: 62--
--Retained size of leaked objects: 12.8KB--
[Window] (native) @35847 [8.3MB]
--4 (element)---> [HTMLDocument] (native) @35845 [6KB]
--part of key -> value pair in ephemeron table (internal)---> [HTMLDocument] (object) @167199 [28 bytes]
--__proto__ (property)---> [HTMLDocument] (object) @173029 [144 bytes]
--properties (internal)---> [(object properties)] (array) @182697 [76 bytes]

...

查看保留器跟踪的一种稍微不那么冗长的方式是应用 leak-filter 或使用 --trace-object-size-above。以下命令只会显示其 retainedSize 大于 1MB 的跟踪。

memlab find-leaks --trace-object-size-above 1000000

结果将如下所示

MemLab found 1 leak(s)
--Similar leaks in this run: 4--
--Retained size of leaked objects: 8.3MB--
[Window] (native) @33651 [8.3MB]
--20 (element)---> [InternalNode] (native) @216691968 [8.3MB]
--8 (element)---> [InternalNode] (native) @216691168 [8.3MB]
--1 (element)---> [EventListener] (native) @216563936 [8.3MB]
--1 (element)---> [V8EventListener] (native) @216563776 [8.3MB]
--1 (element)---> [eventHandler] (closure) @160711 [8.3MB]
--context (internal)---> [<function scope>] (object) @176463 [8.3MB]
--bigArray (variable)---> [Array] (object) @176465 [8.3MB]
--elements (internal)---> [(object elements)] (array) @176489 [8.3MB]

另一个选项是使用 --ignore-leak-cluster-size-below,它会忽略聚合保留大小小于指定阈值的内存泄漏集群。要了解更多关于 find-leaks 命令的信息,请运行 memlab find-leaks -h