推奨チュートリアル: 「JavaScript ビデオ チュートリアル 」
最近、インタビューのレビューをいくつか見ましたが、その多くはそれについて話すよう求められていました。 JS ガベージ コレクション メカニズムについて、正直に言うと、インタビュアーはこの質問をします。つまり、彼は最近 JS ガベージ コレクション メカニズムに関する関連記事をいくつか見たので、B レベルのためについでに尋ねます。 。
最近、JS ガベージ コレクションについて話している海外の記事を見て、わかりやすく説明されていると思ったので翻訳してみました。
JavaScript のメモリ管理は自動的に実行され、目に見えません。私たちはプリミティブ型、オブジェクト、関数を作成します...それらはすべてメモリを必要とします。
何かが不要になった場合はどうなりますか?JavaScript エンジンはそれをどのように検出してクリーンアップしますか?
JavaScript におけるメモリ管理の主な概念はアクセシビリティです。
簡単に言えば、「到達可能性」値は、何らかの方法でアクセス可能または使用可能であり、メモリに保存されることが保証されている値です。
1. 明らかな理由により削除できない、本質的に到達可能な値の基本セットがあります。例:
ローカル関数のローカル変数とパラメーター
現在のネストされた呼び出しチェーン上の他の関数の変数とパラメーター
グローバル変数
その他の内部
これらの値は次のように呼ばれます。根。
2. 参照または参照チェーンがルートから他の値にアクセスできる場合、その値はアクセス可能であるとみなされます。
たとえば、ローカル変数にオブジェクトがあり、そのオブジェクトに別のオブジェクトを参照するプロパティがある場合、そのオブジェクトは到達可能であるとみなされ、そのオブジェクトが参照するオブジェクトも到達可能です。詳細な例以下の通り。
JavaScript エンジンには、ガベージ コレクター と呼ばれるバックグラウンド プロセスがあり、すべてのオブジェクトを監視し、アクセスできないオブジェクトを削除します。
次に、最も簡単な例を示します。
// user 具有对象的引用 let user = { name: "John" };
ここの矢印は、オブジェクト参照を表します。グローバル変数 "user"
は、オブジェクト {name: "John"}
を参照します (簡潔にするために、John という名前を付けます)。 John の "name"
プロパティにはプリミティブ型が格納されているため、それがオブジェクトに描画されます。
user
の値が上書きされると、参照が失われます:
user = null;
これで、John は次のようになります。 unavailable 状態に達しましたが、その状態にアクセスする方法はなく、その状態への参照もありません。ガベージ コレクターは John データを破棄し、メモリを解放します。
次に、参照を user
から admin
:
// user具有对象的引用 let user = { name: "John" }; let admin = user;
にコピーすると仮定します。
ここで同じことを行うとします:
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」を実行し、両方のオブジェクトを含む新しいオブジェクトを返します。
結果のメモリ構造:
これまでのところ、すべてのオブジェクトにアクセスできます。
次に、両方の参照を削除しましょう:
delete family.father; delete family.mother.husband;
すべてのオブジェクトには引き続きアクセスできるため、これら 2 つの参照のうち 1 つだけを削除するだけでは十分ではありません。
しかし、これらの両方を削除すると、John には受信参照がなくなっていることがわかります:
Output Referencesは無関係です。渡されたオブジェクトのみがオブジェクトにアクセスできるようになります。したがって、John はアクセスできなくなり、アクセスできないデータはすべてメモリから削除されます。
ガベージ コレクション後:
相互接続されたオブジェクト全体がアクセスできなくなり、メモリから削除される可能性があります。で。
ソース オブジェクトは上記と同じです。すると:
family = null;
記憶の中の絵は次のようになります:
この例は、アクセシビリティの概念がいかに重要であるかを示しています。
明らかに、ジョンとアンはまだリンクされており、両方とも受信参照を持っています。しかし、これだけでは十分ではありません。
「ファミリー」オブジェクトはルートからリンクが解除されており、そのオブジェクトへの参照が存在しないため、以下のブロック全体が到達不能になり、削除されます。
基本的なガベージ コレクション アルゴリズムは「Mark-スイープ」と呼ばれ、次の「ガベージ コレクション」ステップが定期的に実行されます。
」(記憶)します。
「到達不能なブロック」があることがはっきりとわかります。権利。次に、「mark and clear
」ガベージ コレクターがそれをどのように処理するかを見てみましょう。#最初のステップはルートをマークすることです
#次にその参照をマークします
および子孫への参照:
#プロセス内でアクセス不能になったオブジェクトはアクセス不能とみなされ、削除されます:
#これがガベージ コレクションの仕組みです。 JavaScript エンジンは、実行に影響を与えずに実行を高速化するために多くの最適化を適用します。 いくつかの最適化: 世代リサイクル- オブジェクトは、「新しいオブジェクト」と「古いオブジェクト」の 2 つのグループに分類されます。多くのオブジェクトが表示され、作業を完了してすぐに終了し、すぐにクリーンアップされます。長生きしても「老人」となり、検査を受けることはほとんどありません。
インクリメンタル リサイクル - 多数のオブジェクトがあり、オブジェクトのセット全体を一度に走査してマークしようとすると、実行に時間がかかる場合があります。多少の遅れが生じます。したがって、エンジンはガベージ コレクションを複数の部分に分割しようとします。その後、各部分が個別に実行されます。これには、変更を追跡するための追加のマーカーが必要となるため、大きな遅延ではなく、小さな遅延が多数発生します。
アイドル時間コレクション - ガベージ コレクターは、実行への影響を軽減するために、CPU がアイドル状態のときにのみ実行されます。
面接の答え方
アルゴリズムの 1 つはマーククリア アルゴリズムです。別のアルゴリズムについて説明したい場合は、
ここを参照してください。
さらに詳しい説明
V8 Journey: Garbage Collectorプログラミング入門以上がJavaScript のガベージ コレクション メカニズムを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。