blog

V8ガベージコレクション

1.なぜゴミ収集が必要なのか JSのデータは現在7つの基本データ型と参照データ型に分けられ、V8にはスタック領域とヒープ領域という2つのデータ格納領域があることがわかっています。 スタック領域は一度割...

Oct 19, 2020 · 4 min. read
シェア

なぜゴミ収集が必要なのですか?

JSには現在7つの基本データ型と参照データ型があり、V8にはスタック領域とヒープ領域という2つのデータ格納領域があることを知っておいてください。

一度割り当てられると変更できないスタック空間は、実行コンテキストを格納するために使用され、JSの基本データ型は実行コンテキストの変数/論理環境に格納されます。参照データ型はサイズが可変であり、参照データ型は非常に大きくなる可能性があり、スタックのメンテナンスには適さないため、変数/論理環境は参照データ型への参照のみを保持し、その値は変数ヒープに格納されます。

データにはライフサイクルがあり、ライフサイクルが終了したデータは破棄されるべきで、破棄されないとメモリ領域を占有し続けることになります。

上のグラフに次のコードを仮定します:

function print() {
 var c = 'World';
 var b = 'Hello';
 var a = { name: 'Rskmin' };
}
print();
// print finished, todo others;

印刷関数の実行が終了したら、割り当てられたリソースを回収する必要があります。

スタックリソースを呼び出すには、スタックポインタの先頭を下に移動するだけで、ポインタの上の領域は、未割り当ての領域に属している、次に他の関数を呼び出すことができます直接占有スタックスペースを印刷することによって上書きすることができます。

ヒープ・リソースの場合、スタックと同じリサイクル・メソッドを実装することはできません。

V8がヒープメモリを取り戻す方法

ゴミ収集には多くのアルゴリズムがあり、状況に応じて収集戦略を使い分けることで最良の結果が得られます。そのため、まずメモリ内のゴミを分類し、乾いたゴミと濡れたゴミを分けることが重要です。

V8の廃棄物分類は 生成仮説に基づいて います。

世代仮説

  • つまり、多くのオブジェクトは、メモリが割り当てられると、すぐにアクセスできなくなります。

  • ウィンドウの下にぶら下がっている変数のように、常にメモリ上に長期間存在する不滅のオブジェクト。

    世代仮説によると、ヒープメモリのデータは大まかに 新しい 世代と古い世代に 分けられ、新しい領域は通常1~8Mしかサポートしないのに対し、古い領域ははるかに大きな容量を持ちます。この2つの領域に対して、V8は2つの異なるゴミ収集器を使用し、より効率的にゴミ収集を実装します。

参照カウント

  • 言語エンジンには、メモリ内のすべてのリソースへの参照数を保持する参照テーブルがあります。
  • 値への参照数が0の場合、そのメモリを解放することができます。

新世代廃棄物リサイクル

  • NWSは中古と無料の2つのエリアに分かれています。

  • ゴミの収集が始まると、FROMエリアの生きているオブジェクトをチェックし、生きていればTOエリアにコピーし、終わったらFROMエリアを解放します。

  • 次に、Fromエリアを空け、FromとToエリアを入れ替えます。

  • 複数回のガベージコレクション後もオブジェクトがまだ生きている場合、ライフサイクルの長いオブジェクトは古い世代に移されます。
    • ガベージコレクションを5回以上繰り返してもまだ存在する場合
    • 25%以上のスペースを使用しているオブジェクト、または非常に大きなオブジェクト。

旧世代廃棄物のリサイクル

  • 古い世代は、マークスイープとマークコンパクトの両方を使用し、ほとんどの場合マークスイープを使用し、オブジェクトを格納するのに十分なスペースがない場合はマークコンパクトを使用します。
  • 古い世代はスペースが広く、GCは時間がかかる
  • GC中に応答不能、ストップ・ザ・ワールド
  • V8最適化ソリューション:大きな休止時間を小さな休止時間に分割するインクリメンタル処理

収集プロセス

  • mark-sweep (mark-sweep fast) [メモリの断片化を引き起こす]。
    • 生き残ったオブジェクトをマーク
    • マーク完了後、マークされていないオブジェクトをクリーンアップ

  • mark-compact (mark-compact slow) [メモリの断片化の問題を解決します]。
    • ライブオブジェクトをマーク
    • マーク完了後、ライブオブジェクトをメモリの片側に移動、移動完了後、メモリのもう片側をクリア

タグ付け方式は、メモリの位置を移動させるため、性能は少し悪くなります。 通常はタグ付け方式でメモリを再生しますが、メモリ容量が不足する場合はタグ付け方式でデフラグします。

旧世代では各コレクションの面積が大きいため、長い時間がかかり、その間ブラウザは応答できません。

  • インクリメンタルマーキング方式 1回のリカバリーのプロセスを複数回に分け、無反応の時間を短縮
  • 並列リサイクル リサイクルを支援する複数のヘルパースレッドを開始します。
速度ミディアム最も遅い最速
スペースオーバーヘッド少ない少ないダブルスペース
オブジェクトを移動させるかどうかいいえはいはい
Read next

Cssセレクタの優先度計算

記事を投稿するのは久しぶりで、最近の経験はそれほど楽しいものではありませんでした。しばらくしたら、自分を励ますために技術的でない要約を書くかもしれません。 なぜCssセレクタについて書いたのですか?主な理由は、最近仕事で基本的なスタイルをカプセル化する必要性に迫られ、またいくつかの要件があったのですが、そのうちの1つはスタイルが低重量であることでした。最初はとても単純なことだと思っていたのですが、よく考えてみると、セレクタの基本的な優先順位について、まだもっと知っていることがありました。でもそのためには...

Oct 19, 2020 · 4 min read