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 192 192 211 220 230 2340 249 259 268 287 297 307 316 326 335 345 355 364 374 383 393 402 412 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

あなたのコードは、大部分が空の一時オブジェクトを作成しています ( 1000000 に設定されnew Array(1000000)た空の配列を作成するだけlengthです。1000000 エントリの配列は作成しません)。次に、100 ミリ秒ごとに大きな一時文字列 (およびいくつかのハウスキーピング オブジェクト) を作成します。ある時点で、それは停止します (に設定writtenした場合true)。

各反復の後、配列とハウスキーピング オブジェクトはすぐにガベージ コレクションの対象となり、処理が完了すると文字列がファイルに書き込まれます。しかし、だからといってすぐにきれいになるわけではありません。

システムがそれを停止すると、最終的にガベージ コレクションが開始され、それらのオブジェクトと文字列がすべて解放されます。

タイマーが進み続けると、最終的には実行中でも GC が表示されますが、この例ではメモリに大きな負荷がかかっていないため、優先する理由はありませんでした。

于 2016-12-19T08:22:32.223 に答える