我最初将其记录为原项目中的一个问题 https://github.com/nodejs/help/issues/3590,它立即转移到帮助主题,没有很好的解释,所以现在我想在这里提问。
如果我们在 NodeJS(v14、v16、v17)中运行以下代码:
let arr = new Array(1e8);
for(const a of arr) {
}
console.log('releasing...');
arr = null;
setTimeout(() => {
}, 1e6); // let the process hang idle
进程内存由 GC 立即释放,因此其大小约为 10MB。
现在,如果我们只是交换到任何类型数组,比如说Uint8Array
:
let arr = new Uint8Array(1e8);
for(const a of arr) {
}
console.log('releasing...');
arr = null;
setTimeout(() => {
}, 1e6); // let the process hang idle
现在进程内存永久位于 ~108MB,永远不会被释放。
在原来的帖子中,我有一个关于“内存不足”的回复。这对我来说没有任何意义,因为如果我将数组大小增加到 1e9,也会发生同样的情况,除了类型化数组之外,进程现在永久位于 1GB。对于单个 NodeJS 进程来说,这已经是很多了。
任何人都可以解释一下,如果我看到的是真正的错误还是我不明白的东西?
UPDATE
我的测试表明这可能与具体的问题有关for-of
类型化数组的迭代器,因为如果我删除for-of
迭代器,而是使用以下内容:
let t;
for(let i = 0;i < arr.length;i ++) {
t += arr[i];
}
然后突然内存被正确释放。我现在想知道类型化数组的迭代器实现中是否存在错误,即泄漏或冻结内存。
在 Windows 10 上使用 NodeJS v14、v16 和 v17 进行测试