Javascript - 处理大数组时的内存问题

标签 javascript arrays memory-leaks

我正在开发一个 Javascript 应用程序,它对表示图像数据的数组执行大量的每像素操作。当我设置数组时,我从一个空的“[]”开始,然后用零填充它,有点像这样:

<!DOCTYPE html>
<html>

  <head>

    <script>
      function makeBigArray()
      {
        // Create a data array for a 5000*5000 RGB image
        var imageData = [];
        for (var i = 0, lenI = 5000*5000*3; i < lenI; i++)
        {
            imageData.push(0);
        }
      }
    </script>

  </head>

  <body>

    <button onclick="makeBigArray()">Make Big Array</button>

  </body>

</html>

我很快注意到像这样的循环会导致大量的内存命中。当我执行上述代码时,我得到的内存使用量在 2GB 范围内。

有人可以解释为什么简单地将元素插入数组会产生如此高的内存使用率吗?

最佳答案

在 javascript 中,每个数字都是一个 double,并且在大多数系统上为 8 个字节。这意味着在大多数系统上您的数组为 600000000 字节 (600 MB)。同样,大多数时候,当您推送到数组时,浏览器会分配一个新的内存块,并且垃圾收集器不会立即释放内存。如果内存是个问题,请使用带有一个数字的数组构造函数来表示元素数量,以执行更少的分配。您还可以使用类型化数组,但修改它们会占用大量 CPU。

关于Javascript - 处理大数组时的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52907713/

相关文章:

javascript - 如何将查询字符串与 json 数据匹配?

javascript - 如何获取 Meteor 中单击的单选按钮

javascript - 获取数组中具有某些属性的项目数

javascript - 使用 JQuery 从数组填充表

arrays - 使用循环查找特定数组

javascript - 基本上在 Javascript 中执行 `where` 子句的最佳方法?

c# - 从 C# COM dll 回调到 Delphi 应用程序导致内存泄漏

android - 卡在 "Dumping memory, app will freeze. Brrr."消息

JavaScript 合并多个 bool 数组和 OR ||运算符(operator)

c# - 这里发生了什么? (.Net) GC.CollectionCount(0) 不断增加