在下面的代码片段中,我没有向DOM添加任何新内容,也没有创建任何动态数据类型。我也不增加数组大小。但是,当您在Chrome中运行代码(必须托管或本地托管)时,
的值 performance.memory.usedJSHeapSize
继续增加。为什么?
<html>
<body>
<p id="memory" style="position: fixed; top:10px; left:10px; font-size: 1.5em;"></p>
<script>
setInterval(() => {
document.getElementById("memory").innerHTML = performance.memory.usedJSHeapSize;
}, 300);
</script>
</body>
</html>
它还托管给您查看(在Chrome或Opera中打开):
答案 0 :(得分:1)
该代码中至少有两个分配:
(1)performance.memory
每次调用时都会创建一个新对象。它是用本机代码实现的,但与JavaScript等效的大致是:
Object.defineProperty(performance.__proto__, "memory",
{get: function() {
return {usedJSHeapSize: ...,
totalJSHeapSize: ...,
...: ...};
});
(2)usedJSHeapSize
返回一个数字,但是您正在将该值分配给需要String的setter,因此它被隐式转换为String,这是另一种分配。
请注意,这都不是泄漏:触发垃圾回收时,将清除所有不再需要的旧临时对象。直到周围有足够的垃圾,Chrome才决定进行一些GC可以很好地利用您的CPU。