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

时间:2018-02-05 19:51:57

标签: javascript memory-leaks puppeteer

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

应用运行时价值增长的属性是: JSEventListeners, Nodes, LayoutCount, RecalcStyleCount, LayoutDuration, RecalcStyleDuration, ScriptDuration, TaskDuration, JSHeapUsedSize, JSHeapTotalSize

关于这些东西的信息非常稀疏,我也不断看到人们将page.queryObjects称为另一种查找内存泄漏的方法。但我找不到有关如何使用此API以及查找内容的任何信息。

1 个答案:

答案 0 :(得分:1)

根据Puppeteer Documentation

  

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)

     
      
  • prototypeHandle <JSHandle>对象原型的句柄。
  •   
  • 返回:<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();
     

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上找到。