0

我有以下简单的程序:

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。这里会发生什么?

4

1 回答 1

1

您的代码正在创建大部分为空的临时对象(new Array(1000000)只是创建一个设置为 1000000 的空数组length;它不会创建一个包含 1000000 个条目的数组),然后每 100 毫秒左右创建大型临时字符串(和一些内务对象)。在某些时候,它会停止这样做(当您设置written为时true)。

每次迭代后,数组和管家对象将立即有资格进行垃圾收集,一旦完成,字符串将被写入文件。但这并不意味着它们会立即被清理干净。

一旦系统停止这样做,最终垃圾收集就会启动并释放所有这些对象和字符串。

如果计时器继续运行,最终即使在运行时您也会看到 GC,但在您的示例中没有显着的内存压力,因此没有理由对其进行优先级排序。

于 2016-12-19T08:22:32.223 回答