为什么堆内存使用率持续上升?

时间:2019-05-21 15:58:38

标签: javascript google-chrome memory-leaks v8

在下面的代码片段中,我没有向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中打开):

http://appsdepo.com/temp/memory_leak.html

1 个答案:

答案 0 :(得分:1)

该代码中至少有两个分配:

(1)performance.memory每次调用时都会创建一个新对象。它是用本机代码实现的,但与JavaScript等效的大致是:

Object.defineProperty(performance.__proto__, "memory", 
                      {get: function() { 
                          return {usedJSHeapSize: ..., 
                                  totalJSHeapSize: ...,
                                  ...: ...};
                      });

(2)usedJSHeapSize返回一个数字,但是您正在将该值分配给需要String的setter,因此它被隐式转换为String,这是另一种分配。

请注意,这都不是泄漏:触发垃圾回收时,将清除所有不再需要的旧临时对象。直到周围有足够的垃圾,Chrome才决定进行一些GC可以很好地利用您的CPU。