【问题标题】:How to create memory leak and monitor memory usage in JavaScript如何在 JavaScript 中创建内存泄漏并监控内存使用情况
【发布时间】:2019-09-26 09:20:24
【问题描述】:

我正在尝试使用下面的代码 sn-p 在 JavaScript 中分配内存以研究内存泄漏/消耗。不过

performance.memory.usedJSHeapSize 

总是显示相同的数字,在我的例子中是 10000000。尽管动态创建元素并附加到 DOM,为什么这个数字永远不会改变?

我需要一个 JavaScript sn-p 来创建内存泄漏并使用 performance.memory.usedJSHeapSize 动态监控使用情况(或任何其他函数,如果存在)。

我尝试了这段代码,但 performance.memory.usedJSHeapSize 仍为 10000000:

<body>
    <p id="memory" style="position: fixed; top:10px; left:10px"></p>
<script>

    setInterval(() => {
        document.getElementById("memory").innerHTML = performance.memory.usedJSHeapSize
    }, 300);
     btn = [];
    let i = 0;
    setInterval(() => {
        for (let j = 0; j < 1000; j++) {
            ++i;
            let k=i;
            btn[k] = document.createElement("BUTTON");
            document.body.appendChild(btn[k]);
            btn[k].innerHTML = k;
            btn[k].addEventListener("click", function () {
                alert(k);
            });
        }
    }, 5000);
</script>
</body>

我已经厌倦了这篇文章中 2013 年给出的示例,但是这个也不再造成内存泄漏。

How do I create a memory leak in JavaScript?

【问题讨论】:

  • 我的猜测是您创建的元素太少而无法真正影响到堆。 1000 个 dom 元素和函数对象每 5 秒关闭一个整数?没什么。尝试分配用随机值填充的大型数组并将它们存储在这些按钮中。
  • 没有帮助。你能提供一个可行的例子吗?

标签: javascript memory-leaks


【解决方案1】:

直接从本地文件系统打开页面时,performance.memory.usedJSHeapSize 不会更新。

下图显示,从问题中复制粘贴的完全相同的代码显示在 localhost 访问时内存使用量增加:

或者,您可以自己检查:https://memory-leak.surge.sh/simple/(您也可以检查原始代码:https://memory-leak.surge.sh/,但如果打开超过几秒钟,您的浏览器可能会死机。)


如何像我上面那样托管 HTML:

最简单的选择是使用BrowsersyncParcel 等开发工具。这些工具将允许您从本地文件系统打开文件,就好像它们是从具有类似 http://localhost:1234/ 的 URL 的服务器托管的一样。 (因为您的计算机上启动了一个临时 Web 服务器。)

另一种选择是将文件实际托管在服务器上。有很多选项可以做到这一点:

  • surge我在上面的例子中使用的工具
  • Glitch(这个很酷,因为您可以在线编辑文件并立即查看更改)
  • Github pages

注意:结果可能因浏览器/硬件而异。我的环境:

  • Chrome 版本 74.0.3729.131(官方版本)(64 位)
  • Windows 10

【讨论】:

  • 我需要在远程托管版本上试用它。是的,youtube 网站和许多其他网站 performance.memory.usedJSHeapSize 不断增加。我需要一个简单的 html.js 文件来做同样的事情。请提供一个可以托管但会增加 performance.memory.usedJSHeapSize 的工作示例
  • @Cgraphics:这是托管在服务器上的确切示例代码;它将按预期显示内存使用情况:memory-leak.surge.sh 我的回答已经解释了如何在没有服务器的情况下获得相同的结果,但我将添加有关如何在本地托管的更多详细信息。 (此外,一个非常简单的示例也应该可以。)
猜你喜欢
  • 2013-04-21
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 2011-11-06
  • 2011-09-22
相关资源
最近更新 更多