JavaScript のガベージ コレクション メカニズムを理解する

青灯夜游
リリース: 2020-11-05 18:04:57
転載
2075 人が閲覧しました

JavaScript のガベージ コレクション メカニズムを理解する

推奨チュートリアル: 「JavaScript ビデオ チュートリアル

最近、インタビューのレビューをいくつか見ましたが、その多くはそれについて話すよう求められていました。 JS ガベージ コレクション メカニズムについて、正直に言うと、インタビュアーはこの質問をします。つまり、彼は最近 JS ガベージ コレクション メカニズムに関する関連記事をいくつか見たので、B レベルのためについでに尋ねます。 。

最近、JS ガベージ コレクションについて話している海外の記事を見て、わかりやすく説明されていると思ったので翻訳してみました。

ガベージ コレクション

JavaScript のメモリ管理は自動的に実行され、目に見えません。私たちはプリミティブ型、オブジェクト、関数を作成します...それらはすべてメモリを必要とします。

何かが不要になった場合はどうなりますか?JavaScript エンジンはそれをどのように検出してクリーンアップしますか?

REACHABILITY

JavaScript におけるメモリ管理の主な概念はアクセシビリティです。

簡単に言えば、「到達可能性」値は、何らかの方法でアクセス可能または使用可能であり、メモリに保存されることが保証されている値です。

1. 明らかな理由により削除できない、本質的に到達可能な値の基本セットがあります。例:

  • ローカル関数のローカル変数とパラメーター

  • 現在のネストされた呼び出しチェーン上の他の関数の変数とパラメーター

  • グローバル変数

  • その他の内部

これらの値は次のように呼ばれます。根。

2. 参照または参照チェーンがルートから他の値にアクセスできる場合、その値はアクセス可能であるとみなされます。

たとえば、ローカル変数にオブジェクトがあり、そのオブジェクトに別のオブジェクトを参照するプロパティがある場合、そのオブジェクトは到達可能であるとみなされ、そのオブジェクトが参照するオブジェクトも到達可能です。詳細な例以下の通り。

JavaScript エンジンには、ガベージ コレクター と呼ばれるバックグラウンド プロセスがあり、すべてのオブジェクトを監視し、アクセスできないオブジェクトを削除します。

簡単な例

次に、最も簡単な例を示します。

// user 具有对象的引用
let user = {
  name: "John"
};
ログイン後にコピー

JavaScript のガベージ コレクション メカニズムを理解する

ここの矢印は、オブジェクト参照を表します。グローバル変数 "user" は、オブジェクト {name: "John"} を参照します (簡潔にするために、John という名前を付けます)。 John の "name" プロパティにはプリミティブ型が格納されているため、それがオブジェクトに描画されます。

user の値が上書きされると、参照が失われます:

user = null;
ログイン後にコピー
ログイン後にコピー

JavaScript のガベージ コレクション メカニズムを理解する

これで、John は次のようになります。 unavailable 状態に達しましたが、その状態にアクセスする方法はなく、その状態への参照もありません。ガベージ コレクターは John データを破棄し、メモリを解放します。

2 つの参照

次に、参照を user から admin:

// user具有对象的引用
let user = {
  name: "John"
};
let admin = user;
ログイン後にコピー

JavaScript のガベージ コレクション メカニズムを理解する にコピーすると仮定します。

ここで同じことを行うとします:

user = null;
ログイン後にコピー
ログイン後にコピー

オブジェクトは admin グローバル変数を介して引き続きアクセスできるため、メモリ内にあります。 admin も上書きすると、解放できます。

相互に関連するオブジェクト

次に、より複雑な例であるファミリー オブジェクトを見てみましょう:

function marry (man, woman) {
  woman.husban = man;
  man.wife = woman;
  return {
    father: man,
    mother: woman
  }
}
let family = marry({
  name: "John"
}, {
  name: "Ann"
})
ログイン後にコピー

Functionmarry 2 つのオブジェクトに相互参照を与えることで、" 「marriage」を実行し、両方のオブジェクトを含む新しいオブジェクトを返します。

結果のメモリ構造:

JavaScript のガベージ コレクション メカニズムを理解する

これまでのところ、すべてのオブジェクトにアクセスできます。

次に、両方の参照を削除しましょう:

delete family.father;
delete family.mother.husband;
ログイン後にコピー

JavaScript のガベージ コレクション メカニズムを理解する

すべてのオブジェクトには引き続きアクセスできるため、これら 2 つの参照のうち 1 つだけを削除するだけでは十分ではありません。

しかし、これらの両方を削除すると、John には受信参照がなくなっていることがわかります:

JavaScript のガベージ コレクション メカニズムを理解する

Output Referencesは無関係です。渡されたオブジェクトのみがオブジェクトにアクセスできるようになります。したがって、John はアクセスできなくなり、アクセスできないデータはすべてメモリから削除されます。

ガベージ コレクション後:

JavaScript のガベージ コレクション メカニズムを理解する

到達不能なデータ ブロック

相互接続されたオブジェクト全体がアクセスできなくなり、メモリから削除される可能性があります。で。

ソース オブジェクトは上記と同じです。すると:

family = null;
ログイン後にコピー

記憶の中の絵は次のようになります:

JavaScript のガベージ コレクション メカニズムを理解する

この例は、アクセシビリティの概念がいかに重要であるかを示しています。

明らかに、ジョンとアンはまだリンクされており、両方とも受信参照を持っています。しかし、これだけでは十分ではありません。

「ファミリー」オブジェクトはルートからリンクが解除されており、そのオブジェクトへの参照が存在しないため、以下のブロック全体が到達不能になり、削除されます。

内部アルゴリズム

基本的なガベージ コレクション アルゴリズムは「Mark-スイープ」と呼ばれ、次の「ガベージ コレクション」ステップが定期的に実行されます。

    ガベージ コレクターはルートを取得し、それらを「
  • マーク

    」(記憶)します。

  • 次に、それらからのすべての参照にアクセスして「タグ」を付けます。
  • 次に、マークされたオブジェクトにアクセスし、その参照をマークします。アクセスされたすべてのオブジェクトは記憶されるため、今後同じオブジェクトが 2 回アクセスされることはありません。
  • 未訪問の参照 (ルートからアクセス可能) がなくなるまでこれを繰り返します。
  • #マークされたオブジェクトを除くすべてのオブジェクトが削除されます。
  • たとえば、オブジェクト構造は次のとおりです。

「到達不能なブロック」があることがはっきりとわかります。権利。次に、「JavaScript のガベージ コレクション メカニズムを理解するmark and clear

」ガベージ コレクターがそれをどのように処理するかを見てみましょう。

#最初のステップはルートをマークすることです

#次にその参照をマークします

JavaScript のガベージ コレクション メカニズムを理解する

および子孫への参照:

1JavaScript のガベージ コレクション メカニズムを理解する

#プロセス内でアクセス不能になったオブジェクトはアクセス不能とみなされ、削除されます:

1JavaScript のガベージ コレクション メカニズムを理解する

#これがガベージ コレクションの仕組みです。 JavaScript エンジンは、実行に影響を与えずに実行を高速化するために多くの最適化を適用します。

いくつかの最適化:

1JavaScript のガベージ コレクション メカニズムを理解する

世代リサイクル

- オブジェクトは、「新しいオブジェクト」と「古いオブジェクト」の 2 つのグループに分類されます。多くのオブジェクトが表示され、作業を完了してすぐに終了し、すぐにクリーンアップされます。長生きしても「老人」となり、検査を受けることはほとんどありません。

  • インクリメンタル リサイクル - 多数のオブジェクトがあり、オブジェクトのセット全体を一度に走査してマークしようとすると、実行に時間がかかる場合があります。多少の遅れが生じます。したがって、エンジンはガベージ コレクションを複数の部分に分割しようとします。その後、各部分が個別に実行されます。これには、変更を追跡するための追加のマーカーが必要となるため、大きな遅延ではなく、小さな遅延が多数発生します。

  • アイドル時間コレクション - ガベージ コレクターは、実行への影響を軽減するために、CPU がアイドル状態のときにのみ実行されます。

  • 面接の答え方

  • 1) ゴミとは何かを尋ねる

一般的に、参照されていないオブジェクトはゴミです。ガベージ。クリアされることを意味します。例外があります。複数のオブジェクト参照がリングを形成し、相互に参照しているが、ルートがそれらにアクセスできない場合、これらのオブジェクトもガベージであるため、クリアする必要があります。 2) ガベージのチェック方法

アルゴリズムの 1 つはマーククリア アルゴリズムです。別のアルゴリズムについて説明したい場合は、

ここ

を参照してください。

さらに詳しい説明

V8 Journey: Garbage Collector

プログラミング関連の知識については、

プログラミング入門

をご覧ください。 !

以上がJavaScript のガベージ コレクション メカニズムを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!