![](/img/trans.png)
[英]Chrome memory heap is just 10 MB but the task manager shows 500 MB
[英]Why chrome task manager memory footprint increases dramatically(170mb) on rendering just 10mb string in only one div's innerHTML?
我做了一个小测试,我在单击按钮时创建了一个 10mb 的字符串。 然后在第二个按钮上单击,我在 div 的 innerHTML 中呈现该字符串内容。
编码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
<button id="btn-load">Load string</button>
<button id="btn-render">Render string</button>
<div id="place-to-render"></div>
<script type="module" src="main.js"></script>
</body>
</html>
JS main.js :
let data;
function createBigString() {
data = new Array(10000000).join('x'); //10mb
console.log('created object',data);
}
function render() {
const placeToRender = document.getElementById('place-to-render');
placeToRender.innerHTML = data;
console.log('rendered');
}
document.getElementById('btn-load').addEventListener('click', createBigString);
document.getElementById('btn-render').addEventListener('click', render);
正如这个答案中所解释的
内存占用列与为任务管理器或活动监视器中进程的内存列报告的 MB 数相匹配。
这意味着从操作系统中为 chrome 上的这个特定选项卡获取的实际 RAM。 可以在chrome任务管理器中看到。
我做过的记忆测试(隐身):
在创建字符串(并将其分配给全局变量data
)后,我记录了一个堆快照。
然后我点击渲染字符串按钮,在字符串加载到屏幕后,我又拍了一张快照。
问题:
data
变量上,因此 GC 不应该清理它,对吗?为什么虽然字符串的大小只有 10mb,但内存占用却有如此大的飞跃?
在屏幕上绘制包含 1000 万个字符的字符串所需的像素需要 10 MB 以上的空间。
除了 JS 内存 + 媒体文件 + DOM 节点的总和之外,内存 FP 到底包含什么?
整个渲染器进程的内存。 在我的脑海中,包括各种库、字体、作为渲染过程结果的“图片”,以及用于正在进行的任务的各种临时内存。
不幸的是,我不知道有任何文档或工具可以了解有关这些细节的更多信息; 当然,这并不意味着不存在(参见例如 wOxxOm 的评论)。
为什么实时 JS 的第二个快照从 10mb 变为 1mb,如果这些值仍然保存在全局数据变量上,因此 GC 不应该清理它,对吗?
是的,GC 没有收集字符串。 字符串(即实际字符)的后备存储可以在 V8 和 Blink 之间来回传递。 在这种情况下,显然字符内容被转移到 Blink 的责任,因此它们不再是 JavaScript 堆的一部分(尽管 JS 堆上的String
对象仍然引用它们),但它们仍然是过程的一部分'整体内存占用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.