我正在使用Puppeteer来查找内存泄漏问题。我正在使用puppeteer的page.metrics() API,但我无法理解每个属性的含义。随着时间的推移,指标中的所有值都会不断增加。这是预期的吗?或者这表明可能存在严重的内存泄漏?
应用运行时价值增长的属性是:
JSEventListeners, Nodes, LayoutCount, RecalcStyleCount, LayoutDuration, RecalcStyleDuration, ScriptDuration, TaskDuration, JSHeapUsedSize, JSHeapTotalSize
关于这些东西的信息非常稀疏,我也不断看到人们将page.queryObjects
称为另一种查找内存泄漏的方法。但我找不到有关如何使用此API以及查找内容的任何信息。
答案 0 :(得分:1)
page.metrics()
- 返回:<Promise <Object >>包含度量作为键/值对的对象。
Timestamp
<number>采取度量样本的时间戳。Documents
<number>页面中的文档数。Frames
<number>页面中的帧数。JSEventListeners
<number>页面中的事件数。Nodes
<number>页面中的DOM节点数。LayoutCount
<number>全部或部分页面布局的总数。RecalcStyleCount
<number>页面样式重新计算的总数。LayoutDuration
<number>所有页面布局的合并持续时间。RecalcStyleDuration
<number>所有页面样式重新计算的总持续时间。ScriptDuration
<number> JavaScript执行的总时间。TaskDuration
<number>浏览器执行的所有任务的合并持续时间。JSHeapUsedSize
<number>使用的JavaScript堆大小。JSHeapTotalSize
<number> JavaScript堆总大小。注意所有时间戳均为单调时间:从过去的任意点开始,以秒为单位单调增加时间。
page.queryObjects(prototypeHandle)
该方法迭代JavaScript堆并查找具有给定原型的所有对象。
// Create a Map object await page.evaluate(() => window.map = new Map()); // Get a handle to the Map object prototype const mapPrototype = await page.evaluateHandle(() => Map.prototype); // Query all map instances into an array const mapInstances = await page.queryObjects(mapPrototype); // Count amount of map objects in heap const count = await page.evaluate(maps => maps.length, mapInstances); await mapInstances.dispose(); await mapPrototype.dispose();
page.mainFrame().executionContext().queryObjects(prototypeHandle)的快捷方式。
page.metrics()
方法返回Chrome DevTools协议Performance.getMetrics
的结果:
Performance.getMetrics
检索运行时指标的当前值。
返回对象
metrics
数组Metric
- 运行时指标的当前值。
另一方面,page.queryObjects()
方法附带的Chrome DevTools协议为Runtime.queryObjects
:
Runtime.queryObjects
参数
prototypeObjectId
RemoteObjectId
- 要为其返回对象的原型的标识符。
objectGroup
字符串(可选)
- 可用于发布结果的符号组名称。
返回对象
objects
RemoteObject
- 带有对象的数组。
page.matrics()
和page.queryObjects()
的源代码可以在GitHub上找到。