性能:measureUserAgentSpecificMemory() 方法

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

注意:此功能在 Web Workers 中可用。

实验性: 这是一项实验性技术
在生产中使用此技术之前,请仔细检查浏览器兼容性表格

measureUserAgentSpecificMemory() 方法用于估算 Web 应用程序的内存使用情况,包括其所有 iframe 和 worker。

语法

js
measureUserAgentSpecificMemory()

参数

无。

返回值

一个 Promise,它解析为一个包含以下属性的对象

bytes

表示总内存使用量的数字。

breakdown

一个对象数组,用于划分总 bytes 并提供归属和类型信息。该对象包含以下属性

bytes

此条目描述的内存大小。

attribution

使用内存的 JavaScript realm 的容器元素的数组。该对象具有以下属性

url

如果此归属对应于同源 JavaScript realm,则此属性包含该 realm 的 URL。否则,它是一个字符串 "cross-origin-url"。

container

一个描述包含此 JavaScript realm 的 DOM 元素的 JavaScript 对象。该对象具有以下属性

id

容器元素的 id 属性。

src

容器元素的 src 属性。如果容器元素是 <object> 元素,则此字段包含 data 属性的值。

scope

描述同源 JavaScript realm 类型的字符串。对于跨域情况,可以是 "Window""DedicatedWorkerGlobalScope""SharedWorkerGlobalScope""ServiceWorkerGlobalScope""cross-origin-aggregated"

types

与内存关联的实现定义的内存类型数组。

示例返回值如下所示

json
{
  "bytes": 1500000,
  "breakdown": [
    {
      "bytes": 1000000,
      "attribution": [
        {
          "url": "https://example.com",
          "scope": "Window"
        }
      ],
      "types": ["DOM", "JS"]
    },
    {
      "bytes": 0,
      "attribution": [],
      "types": []
    },
    {
      "bytes": 500000,
      "attribution": [
        {
          "url": "https://example.com/iframe.html",
          "container": {
            "id": "example-id",
            "src": "redirect.html?target=iframe.html"
          },
          "scope": "Window"
        }
      ],
      "types": ["JS", "DOM"]
    }
  ]
}

异常

SecurityError DOMException

如果未满足防止跨域信息泄露的 安全要求,则抛出此异常。

描述

浏览器在创建对象时自动分配内存,并在对象不再可达时(垃圾回收)释放内存。此垃圾回收(GC)是一种近似,因为确定特定内存是否仍被需要的通用问题是不可能的(另请参阅 JavaScript 内存管理)。开发者需要确保对象被垃圾回收,内存不发生泄漏,并且内存使用量不会随着时间的推移而无谓地增长,导致 Web 应用程序缓慢且无响应。内存泄漏通常是由忘记注销事件监听器、未关闭 worker、在数组中累积对象等引起的。

measureUserAgentSpecificMemory() API 聚合内存使用数据,以帮助您查找内存泄漏。它可以用于检测内存回归或对功能进行 A/B 测试以评估其内存影响。与其单次调用此方法,不如定期调用以跟踪会话期间内存使用量的变化。

此 API 返回的 byte 值在不同浏览器之间或同一浏览器的不同版本之间不可比较,因为这些值高度依赖于实现。此外,breakdownattribution 数组的提供方式也取决于浏览器。最好不要硬编码对此数据的任何假设。此 API 更适合定期调用(以随机间隔)来聚合数据并分析样本之间的差异。

安全要求

要使用此方法,您的文档必须处于 安全上下文 并且 跨域隔离

您可以使用 Window.crossOriginIsolatedWorkerGlobalScope.crossOriginIsolated 属性来检查文档是否跨域隔离。

js
if (crossOriginIsolated) {
  // Use measureUserAgentSpecificMemory
}

示例

监控内存使用情况

以下代码显示了如何使用 指数分布 每五分钟以随机间隔调用一次 measureUserAgentSpecificMemory() 方法。

js
function runMemoryMeasurements() {
  const interval = -Math.log(Math.random()) * 5 * 60 * 1000;
  console.log(`Next measurement in ${Math.round(interval / 1000)} seconds.`);
  setTimeout(measureMemory, interval);
}

async function measureMemory() {
  const memorySample = await performance.measureUserAgentSpecificMemory();
  console.log(memorySample);
  runMemoryMeasurements();
}

if (crossOriginIsolated) {
  runMemoryMeasurements();
}

规范

规范
测量内存 API
# ref-for-dom-performance-measureuseragentspecificmemory⑤

浏览器兼容性

另见