Javascript 为什么从dom中删除几乎所有对象不会导致内存降低?

Javascript 为什么从dom中删除几乎所有对象不会导致内存降低?,javascript,memory-leaks,google-chrome-devtools,snapshot,Javascript,Memory Leaks,Google Chrome Devtools,Snapshot,当我打开ChromeDeveloperTools,打开这个网页,并拍摄快照时,大小是2.1MB 当我单击其中一个按钮时,所有按钮及其div都将被删除。如果我再拍一张快照,大小是1.6MB 那么,在使用Chrome developer工具和拍摄快照时,网页总是会消耗一些内存,您在拍摄快照和查找内存泄漏时需要考虑这些内存吗 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.d

当我打开ChromeDeveloperTools,打开这个网页,并拍摄快照时,大小是2.1MB

当我单击其中一个按钮时,所有按钮及其div都将被删除。如果我再拍一张快照,大小是1.6MB

那么,在使用Chrome developer工具和拍摄快照时,网页总是会消耗一些内存,您在拍摄快照和查找内存泄漏时需要考虑这些内存吗

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <script type="text/javascript">
        var onLoadFunc = function() {
            for(var x=0;x<30000;x++) {
                var button = document.createElement("input");
                button.type = "button";
                button.value = "Destroy Content";
                button.onclick = destroyFunc;
                document.getElementById('mainDiv').appendChild(button);
            }
        };

        var destroyFunc = function() {
            var el = document.getElementById( 'mainDiv' );
            el.parentNode.removeChild(el);
        };
    </script>
</head>
<body onLoad="onLoadFunc()">
  <div id="mainDiv"/>
</body>
</html>

var onLoadFunc=函数(){

对于(var x=0;x您在1.6MB中看到的内容包括已销毁但仍保留在内存中的对象,因为它们尚未被垃圾收集


销毁一个对象并不保证它何时会被垃圾收集。

您可以在快照中看到javascript引擎在堆中保留的所有内容。 javascript引擎(v8)实际上对几乎所有内容都使用heap,包括页面生成的代码、内部v8脚本、对象、映射等


这可能会让您感到困惑,因为您无法控制这些对象的生存期,但如果我们在快照中隐藏这些内部内容,则会出现更大的问题。在这种情况下,您可能会问,为什么当从“我的对象”中删除对该对象的所有引用时,该对象仍处于活动状态。或者为什么空页使用1.6mb的js堆,而堆快照却什么也没有显示。等。

好的。所以,在我的应用程序中排除内存泄漏故障时,我如何知道对象是否还没有被垃圾收集,或者实际上是否存在内存泄漏?最好的方法是使用chrome内置的对象分配跟踪器。你可以用它来识别在特定时间不应该在内存中的任何对象。ta的过程king快照至少包含2个gc调用。因此它不是垃圾。查看了对象分配跟踪器和文档。需要进一步检查它以了解如何使用其输出。但是感谢您的建议。