性能:measureUserAgentSpecificMemory() 方法
注意:此功能在 Web Workers 中可用。
measureUserAgentSpecificMemory() 方法用于估算 Web 应用程序的内存使用情况,包括其所有 iframe 和 worker。
语法
measureUserAgentSpecificMemory()
参数
无。
返回值
一个 Promise,它解析为一个包含以下属性的对象
bytes-
表示总内存使用量的数字。
breakdown-
一个对象数组,用于划分总
bytes并提供归属和类型信息。该对象包含以下属性bytes-
此条目描述的内存大小。
attribution-
使用内存的 JavaScript realm 的容器元素的数组。该对象具有以下属性
url-
如果此归属对应于同源 JavaScript realm,则此属性包含该 realm 的 URL。否则,它是一个字符串 "cross-origin-url"。
container-
一个描述包含此 JavaScript realm 的 DOM 元素的 JavaScript 对象。该对象具有以下属性
scope-
描述同源 JavaScript realm 类型的字符串。对于跨域情况,可以是
"Window"、"DedicatedWorkerGlobalScope"、"SharedWorkerGlobalScope"、"ServiceWorkerGlobalScope"或"cross-origin-aggregated"。
types-
与内存关联的实现定义的内存类型数组。
示例返回值如下所示
{
"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"]
}
]
}
异常
SecurityErrorDOMException-
如果未满足防止跨域信息泄露的 安全要求,则抛出此异常。
描述
浏览器在创建对象时自动分配内存,并在对象不再可达时(垃圾回收)释放内存。此垃圾回收(GC)是一种近似,因为确定特定内存是否仍被需要的通用问题是不可能的(另请参阅 JavaScript 内存管理)。开发者需要确保对象被垃圾回收,内存不发生泄漏,并且内存使用量不会随着时间的推移而无谓地增长,导致 Web 应用程序缓慢且无响应。内存泄漏通常是由忘记注销事件监听器、未关闭 worker、在数组中累积对象等引起的。
measureUserAgentSpecificMemory() API 聚合内存使用数据,以帮助您查找内存泄漏。它可以用于检测内存回归或对功能进行 A/B 测试以评估其内存影响。与其单次调用此方法,不如定期调用以跟踪会话期间内存使用量的变化。
此 API 返回的 byte 值在不同浏览器之间或同一浏览器的不同版本之间不可比较,因为这些值高度依赖于实现。此外,breakdown 和 attribution 数组的提供方式也取决于浏览器。最好不要硬编码对此数据的任何假设。此 API 更适合定期调用(以随机间隔)来聚合数据并分析样本之间的差异。
安全要求
要使用此方法,您的文档必须处于 安全上下文 并且 跨域隔离。
您可以使用 Window.crossOriginIsolated 和 WorkerGlobalScope.crossOriginIsolated 属性来检查文档是否跨域隔离。
if (crossOriginIsolated) {
// Use measureUserAgentSpecificMemory
}
示例
监控内存使用情况
以下代码显示了如何使用 指数分布 每五分钟以随机间隔调用一次 measureUserAgentSpecificMemory() 方法。
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⑤ |
浏览器兼容性
加载中…