【发布时间】:2015-08-14 07:54:40
【问题描述】:
所以基本上我正在尝试找到一种内存有效的方法来复制数组。假设我们有 arr1,其中包含 500000 个值 true 的元素:
var arr1 = [];
for (var i = 0; i < 500000; i++) {
arr1[i] = true;
}
在 Node.js 中,它占用了大约 32.3 MiB(包括 Node 启动时的 18.7 MiB)。现在,显然当您引用arr1 时,不会分配内存:
var arr2 = arr1;
现在,当我将arr1 复制到arr2 中时:
var arr2 = arr1.concat();
进程占用 36.2 MiB,所以大约 4 MiB。
事情是这样的:无论我做什么来清空或擦除原始数组,分配给该数组的内存都不会被垃圾收集器释放或拾取。假设我有:
arr1.length = 0;
delete arr1;
arr1 = undefined;
arr1 = arr2.concat();
多亏了这一点,该进程现在占用了 39.8 MiB。
那么这里到底发生了什么?是否有一些对 Node(或那里的任何 JS 引擎)试图向我隐藏的原始数组的秘密引用?这是进一步的代码:
arr2.length = 0;
delete arr2;
arr2 = undefined;
arr2 = arr1.concat();
这将简单地“清空”arr2,因此它可以保存arr1 的副本。正如您可能已经知道的那样,我正在尝试来回传输数组的内容,但现在该进程占用了 43.5 MiB。如果这是一个大数组,那么内存消耗会很大。考虑到内存效率,有没有办法做到这一点?
【问题讨论】:
-
只是好奇,你是如何分析内存使用情况的?
-
还有多久在你丢弃原始数组你检查内存使用情况? GC 可能不会立即收集它。
-
我只是使用 xfce4-taskmanager 来检查内存使用情况。我等了大约 10 分钟,使用情况完全没有变化。
-
您是否尝试过强制进行垃圾收集?也许this article 会帮你解决这个问题。
-
@CathedralZealot 你在浏览器控制台中测试这个吗?如果是,是哪个浏览器。
标签: javascript arrays node.js memory