我需要更多关于 Puppeteer page.metrics 和 queryObjects 的信息

Eva*_*sen 6 javascript memory-leaks puppeteer

我正在使用Puppeteer来查找内存泄漏问题。我正在使用puppeteerpage.metrics() API,但我无法理解每个属性的含义。随着时间的推移,我在指标中的所有价值都在不断增加。这是预期的吗?或者这是否表明可能存在严重的内存泄漏?

随着应用程序运行,价值不断增长的属性是: JSEventListeners, Nodes, LayoutCount, RecalcStyleCount, LayoutDuration, RecalcStyleDuration, ScriptDuration, TaskDuration, JSHeapUsedSize, JSHeapTotalSize

关于这些东西的信息非常稀少,而且我一直看到人们将其page.queryObjects称为查找内存泄漏的另一种方法。但是我找不到有关如何使用此 API 以及要查找什么的任何信息。

Gra*_*ler 3

根据Puppeteer 文档

页面.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<数字JavaScript 堆大小。
    • JSHeapTotalSize<number> JavaScript 堆总大小

注意:所有时间戳都是单调时间:从过去的任意点开始以秒为单位单调增加时间。

page.queryObjects(prototypeHandle)

  • prototypeHandle<对象原型的句柄。
  • 返回: < Promise < JSHandle >> Promise 解析为具有此原型的对象数组的句柄。

该方法迭代 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();
Run Code Online (Sandbox Code Playgroud)

快捷方式page.mainFrame().executionContext().queryObjects(prototypeHandle)


page.metrics()方法返回 Chrome DevTools 协议的结果Performance.getMetrics

性能.getMetrics

检索运行时指标的当前值。

返回对象

  • metrics 数组度量
    • 运行时指标的当前值。

另一方面,该page.queryObjects()方法附带的 Chrome DevTools 协议是Runtime.queryObjects

运行时.queryObjects

参数

  • prototypeObjectId 远程对象ID
    • 返回对象的原型的标识符。
  • objectGroup 细绳(可选)
    • 可用于发布结果的符号组名称。

返回对象


page.metrics()和的源代码page.queryObjects()可以在 GitHub 上找到。