検索

ホームページ  >  に質問  >  本文

node.js - ノードのガベージ コレクションとメモリ リークに関連する問題

最近、ガベージ コレクションについて勉強し始めたところです。Ele.me のフロントエンドでのノード メモリの解放に関連する質問に答えようとしていたときに、いくつかの質問に遭遇しました。 リーリー

配列を無限に増やすと、間違いなくメモリがバーストします。

リーリー

これはずっと使われているだけ

で解放できないですよね? arr ,导致 arr リーリー

これは、

のサイズが8k未満であるためです。最初にメモリプールがいっぱいかどうかを確認するため、メモリが爆発しないはずです。 Buffer リーリー

これは

のクロージャが原因です。このクロージャはリサイクルされないため、常にメモリに蓄積されます?unusedoriginalThing 进行了引用,所以每一个 unused 都形成了一个 originalThing 的作用域 replaceThing

よくわからないので詳しい方に回答していただきたいです、よろしくお願いします!

某草草某草草2752日前712

全員に返信(3)返信します

  • 漂亮男人

    漂亮男人2017-05-16 13:44:15

    新しいバッファーは、おそらく単純なメモリ爆発の問題ではありません。バッファーは V8 ヒープの外に割り当てられているため、実際には、先ほどクラッシュした問題よりも深刻です。

    2 番目に言っておきたいのは、配列サイズが増加しないため、メモリがバーストしないということです。

    理由はオリジナル記事3本目に記載しております

    たとえば、上記の場合、未使用の関数はoriginalThingへの参照を保持しているため、古いオブジェクトが毎回解放されず、メモリリークが発生することはありません

    それでも理解できない場合は、詳細に説明されている元の発見者の記事を読むことができます。

    返事
    0
  • 黄舟

    黄舟2017-05-16 13:44:15

    無限ループ コードはどこに行ってもメモリをバーストします。特に js のようなシングルスレッド言語では、直接ブロックされてフリーズします。
    Buffer タイプを使用したことがないので、メモリ プールをチェックするかどうかはわかりませんが、スタックしているかどうかはあまり意味がありません。

    最後のステートメントに同意します。各サイクルで新しいオブジェクトが作成され、theThing の参照アドレスは常に変化します。通常の状況では、古い参照オブジェクトはガベージ コレクションされる必要がありますが、未使用のオブジェクトは、originalThing、originalThing Another private を参照します。変数のため、古いオブジェクトをガベージ コレクションできず、メモリ リークが発生します。

    Chrome 環境で 30 秒間実行される次のコードに違いはありますか?
    最初の写真は、このコードを使用しない場合の結果であり、メモリは 15M でフロートします。
    2 番目の写真はこのコードの結果であり、メモリは増加し続けます。

    リーリー

    返事
    0
  • 高洛峰

    高洛峰2017-05-16 13:44:15

    よくわかりませんが、memwatch-next パッケージを使用して見てみることができます

    返事
    0
  • キャンセル返事