查找未报告的内存泄漏
默认情况下,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
。