以编程方式获取 Chrome 中的内存使用情况

Posted

技术标签:

【中文标题】以编程方式获取 Chrome 中的内存使用情况【英文标题】:Programmatically get memory usage in Chrome 【发布时间】:2013-08-29 14:56:32 【问题描述】:

如何以编程方式在 Google Chrome 中获取我的网站的内存使用情况(JS 和总计)?

我曾考虑使用未记录的 HeapProfiler(参见 here)从 Chrome 扩展程序中执行此操作,但我找不到从中获取数据的方法。

我想在每次发布时测量它的内存消耗,所以这需要编程。

编辑:我想出了如何让 HeapProfiler 方法工作。每个addHeapSnapshotChunk 事件都有一个 JSON 对象块。

chrome.browserAction.onClicked.addListener(function(tab) 
  var heapData,
    debugId = tabId:tab.id;
  chrome.debugger.attach(debugId, '1.0', function()     
    chrome.debugger.sendCommand(debugId, 'Debugger.enable', , function() 
      function headerListener(source, name, data) 
        if(source.tabId == tab.id && name == 'HeapProfiler.addProfileHeader') 
          function chunkListener(source, name, data) 
            if(name == 'HeapProfiler.addHeapSnapshotChunk') 
              heapData += data.chunk;
             else if(name == 'HeapProfiler.finishHeapSnapshot') 
              chrome.debugger.onEvent.removeListener(chunkListener);
              chrome.debugger.detach(debugId);
              //do something with data
              console.log('Collected ' + heapData.length + ' bytes of JSON data');
            
          
          chrome.debugger.onEvent.addListener(chunkListener);
          chrome.debugger.sendCommand(debugId, 'HeapProfiler.getHeapSnapshot', uid:data.header.uid, type:data.header.typeId);
        
        chrome.debugger.onEvent.removeListener(headerListener);
      
      chrome.debugger.onEvent.addListener(headerListener);
      chrome.debugger.sendCommand(debugId, 'HeapProfiler.takeHeapSnapshot');
    );
  );
);

解析后,JSON 包含节点、边以及关于节点和边类型和字段的描述性元数据。

或者,如果我只想要总数,我可以使用 Timeline 事件。

也就是说,有没有比我在这里找到的更好的方法?

【问题讨论】:

我不确定您需要多少详细信息,但您检查过window.performance 对象吗?它简要概述了内存使用情况,不需要访问扩展。 我有,特别是window.performance.memory。不过,它似乎与堆配置文件不匹配。我实际上不需要很多细节;总内存使用量就足够了。 【参考方案1】:

对于将来发现此问题的任何人,因为版本 20 Chrome 支持window.performance.memory,它会返回如下内容:


  totalJSHeapSize: 21700000,
  usedJSHeapSize: 13400000,
  jsHeapSizeLimit: 1620000000

【讨论】:

我一直在尝试这一点,即使在创建 1,000,000 多个键/值对象之前和之后,值也不会改变... 尝试使用 CLI 标志 –-enable-precise-memory-info 启动 Chrome。 @Pavel Vlasov 正确版本:--enable-precise-memory-info 好的,这确实有效,但您必须确保之前没有运行 chrome.exe 进程。【参考方案2】:

另一种方法: 写一个指向这个 URL 的网页爬虫:

chrome://system/

(注意:如果此 URL 再次更改,这是列出所有 chrome 诊断页面的“主”URL:chrome://chrome-urls/

该页面有一个“mem_usage”部分,提供了内存使用的详细信息。

也许有某种方法可以将 Chrome 脚本作为用户(比如在 AutoIT 或 Python 中?)在 Chrome 中加载此 URL,然后按下更新按钮,然后解析 JSON 以获取任何选项卡的内存使用情况有兴趣。


其他方法:

来自 javascript - 使用 window.performance

来自 JavaScript - 使用 browser-report.js -

https://www.npmjs.com/package/browser-report

【讨论】:

【参考方案3】:

chrome 开发通道有一个进程 api,chrome.process。可以查询一个tab的进程信息,包括各种内存信息。 http://developer.chrome.com/extensions/processes.html

【讨论】:

有没有办法从浏览器外部调用这个API?【参考方案4】:

有一个 js 库:https://github.com/spite/memory-stats.js

【讨论】:

【参考方案5】:

只是此线程的更新:从 chrome 83 开始,performance.measureMemory() 似乎是在 chrome 上获取内存信息的最可靠方法。即使同一个堆被多个网页共享,它也为我们提供了准确的内存信息!!。 您可以在以下位置找到更多信息:https://web.dev/monitor-total-page-memory-usage/

【讨论】:

从 Chrome 89 开始重命名为 performance.measureUserAgentSpecificMemory。此功能可能并非始终默认启用,请参阅帖子链接。

以上是关于以编程方式获取 Chrome 中的内存使用情况的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式获取堆栈内存统计信息?

如何以编程方式获取进程使用的内存量? [复制]

Python,Chrome 任务管理器 - 以编程方式访问 Chrome 任务管理器的文本而不使用 CHROMIUM

Prometheus 查询以获取 kubernetes pod 中的 CPU 和内存使用情况

以编程方式访问正在运行的 iOS 应用程序中的内存使用数据?

C# 中的内存使用情况