我有以下简单程序:
const fs = require("fs");
const time = Date.now();
const file = fs.createWriteStream('./test.txt');
let written = true;
file.on('drain', function () {
written = true;
});
const interval = setInterval(function () {
if (Date.now() - time > 10000) {
clearInterval(interval);
}
if (written) {
written = file.write(new Array(1000000).join('z'));
console.log(Math.floor(process.memoryUsage().rss / (1024 * 1024)));
}
}, 100);
记录以下内存消耗:
29 38 48 58 67 77 86 96 105 115 125 134 144 153 163 173 182 192 201 211 220 230 240 249 259 268 278 287 297 307 316 326 335 345 355 364 374 383 393 402 412 422 431 441 450 460 470 479 489 498 508 518 527 537 546 556 565 575 585 561
87 97 25 35 44 25 35 44 25 35 44 25 35 44 25 35 44 25 35 44 25 35 44 25 35 44 25 35 44
正如您可能会看到它增长到561 MB
,但是已降至87 MB
,然后保持在100 MB
之下。这里发生了什么?
答案 0 :(得分:1)
您的代码正在创建大部分空的临时对象(new Array(1000000)
只创建一个空数组,其中length
设置为1000000;它不会创建一个包含1000000个条目的数组)然后创建大型临时字符串(每100ms左右一些家务用品。在某些时候,它会停止这样做(当您将written
设置为true
时)。
每次迭代后,数组和管家对象都可以立即进行垃圾收集,并且字符串一旦完成就被写入文件。但这并不意味着他们会立即清理干净。
一旦系统停止这样做,最终垃圾收集就会启动并释放所有这些对象和字符串。
如果计时器继续运行,最终你会在GC运行时看到GC,但是你的例子没有明显的内存压力,因此没有理由优先考虑它。