【问题标题】:Programmatically get memory usage in Chrome以编程方式获取 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。不过,它似乎与堆配置文件不匹配。我实际上不需要很多细节;总内存使用量就足够了。

标签: javascript performance google-chrome google-chrome-devtools memory-profiling


【解决方案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】:

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 从 Chrome 89 开始重命名为 performance.measureUserAgentSpecificMemory。此功能可能并非始终默认启用,请参阅帖子链接。
      猜你喜欢
      • 2013-05-05
      • 2017-09-01
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-21
      相关资源
      最近更新 更多