所以我注意到在使用someElement.innerHTML
时,DOM节点数会增加。
我猜这个引用已被终止,但是在垃圾收集器删除对象之前仍然会分配内存。
实施例(HTML):
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="test.css">
<script src="script.js"></script>
</head>
<body onload="startTimer()">
<div id="timeContainer">Time Goes Here</div>
</body>
</html>
实施例(的JavaScript):
var timer;
var body;
var oldTime = "";
var timeContainer;
function startTimer(){
timeContainer = document.getElementById("timeContainer");
timer = setInterval(getTime, 10);
}
function getTime(){
var d = new Date();
var timeString = d.getUTCHours() +":"+ d.getUTCMinutes(); +":"+ d.getUTCSeconds();
if(timeString != oldTime){
oldTime = timeString;
timeContainer.innerHTML = timeString;
}
}
someElement.textContent
。当我只刷新内容时,我怎么能避免增加节点数量?为什么它还需要一个额外的节点呢?
答案 0 :(得分:2)
我猜这个引用已被杀死,但仍然分配了内存 直到垃圾收集器删除对象。
正确。
即使只是一次,我怎么能避免增加节点数 令人耳目一新的内容?
你不能,也不应该担心。这是浏览器的域,它在垃圾收集方面做了它想做的事情(不同的浏览器可能会有不同的做法)。
每次刷新计时器时都删除了整个ParentElement 创造了一个新的
仅仅因为你删除了它(使其无法访问),并不意味着它立即被垃圾收集。
答案 1 :(得分:2)
这是自然而且可取的。
浏览器垃圾收集异步运行。一旦你的实际DOM分离了节点,它就不能保证它们没有堆。他们将留在那里,直到下一次垃圾收集触发。
作为told in dev tools # Fix Memory Problems,不要担心它并将其留给垃圾收集过程。
请注意,只要它不会损害您的应用程序性能,请将其保留给GC。如果它真的推动你进入浏览器缓慢和混乱,你应该真正开始熟练并修复它。这可能是潜在的内存泄漏。
只有在页面的DOM树或JavaScript代码中没有对DOM节点进行引用时,才能对其进行垃圾回收。一个节点被称为&#34;分离&#34;当它从DOM树中删除但是一些JavaScript仍然引用它。分离的DOM节点是内存泄漏的常见原因。本节将教您如何使用DevTools&#39;堆分析器用于标识分离的节点。
使用Chrome Dev工具在同一篇文章中给出了修复。简而言之,拍摄堆的快照并开始查看分离的节点。
突出显示为黄色的节点可以从JavaScript代码直接引用它们。突出显示为红色的节点没有直接引用。它们只是活着的,因为它们是黄色节点树的一部分。通常,您希望专注于黄色节点。修复你的代码,使黄色节点的活动时间不超过它所需的时间,并且你还可以删除属于黄色节点树的红色节点。