Garbage Collection
3513 ワード
Garbage Collection
1.メモリリーク
メモリの漏洩は、不注意やエラーで不要なメモリを解放できないことを意味します.1つの例は、変数をグローバルオブジェクトに格納できる不要なvarキーワードです.function saveGlobalVariable() {
this.memory = "leak";
}
saveGlobalVariable();
上記のコードは、関数に'leak'
文字列をこのキーワードでグローバルオブジェクトのメモリpropertyに格納します.これは、newキーでインスタンスを作成すると、インスタンスが作成されたメモリpropertyに格納されますが、通常の関数呼び出しを使用するため、グローバルオブジェクトを指し、変数をグローバルオブジェクトに格納します.
この場合、メモリが漏れる可能性があり、メモリが漏れるとパフォーマンスが低下します.では、メモリ管理はどのように実現しますか?
2. Garbage Collection
C、C++などの低レベル言語では手動クリーンアップメカニズムが用いられ、JavaScriptではゴミ収集(GC、Garbage Collection)と呼ばれる自動メモリ管理方法が用いられる.ごみ収集は、メモリ管理を実行するために達成性(readability)概念を使用します.ここで、「到達可能」(readable)値は、参照によってアクセスまたは使用できる値を意味し、「到達可能」値はメモリから解放されません.
したがって、現在の関数の領域変数|パラメータ、ネストされた関数チェーンの関数で使用される変数|パラメータ、グローバル変数など、明確な理由がなければメモリは解放されません.
3.Garbage Collectionでのメモリ管理メカニズム
3-1)参照カウント方法
不要なオブジェクトを他のオブジェクトに参照されないオブジェクトとして定義することでメモリを解放します.次の図に示すように、いくつかのオブジェクトが参照されているとします.
上図で参照されていないメモリはないため、不要なセットから解放されるメモリはありません.ここに参照できないメモリがある場合、メモリは不要なセットで解放されます.
※参照-カウントの欠点-ループ参照
上図では、赤い矢印で接続の参照を解除したとします.ではrootからオレンジメモリまではできませんが、オレンジメモリは相互参照の循環参照構造を形成します.
[参照カウント](Reference Count)メソッドでは、上記の循環参照構造のメモリは解放されません.
3-2) Mark and Sweep
不要になったオブジェクトを接触できないオブジェクト(Unreable)として定義し、メモリを解放します.この方法はルートオブジェクト(Javascriptではグローバル変数)から始まり,これをタッチ可能オブジェクトとタッチ不可オブジェクトに分ける.
この方式は3−1)参照カウントよりも有効である.上の図に示すように、ループリファレンス構造があってもルートからオブジェクトに接触できないため、メモリから解放されます.したがって、最新のブラウザでは、ゴミ収集でタグとクリア方式が使用されます.
※Mark and Sweepの欠点-手動解除
JAvascriptのGC自動管理メモリは、ルートディレクトリから参照可能なデータを直接削除しようとしても手動で解除することはできません.
3-2-1)マークとクリアの動作原理
メモリの漏洩は、不注意やエラーで不要なメモリを解放できないことを意味します.1つの例は、変数をグローバルオブジェクトに格納できる不要なvarキーワードです.
function saveGlobalVariable() {
this.memory = "leak";
}
saveGlobalVariable();
上記のコードは、関数に
'leak'
文字列をこのキーワードでグローバルオブジェクトのメモリpropertyに格納します.これは、newキーでインスタンスを作成すると、インスタンスが作成されたメモリpropertyに格納されますが、通常の関数呼び出しを使用するため、グローバルオブジェクトを指し、変数をグローバルオブジェクトに格納します.この場合、メモリが漏れる可能性があり、メモリが漏れるとパフォーマンスが低下します.では、メモリ管理はどのように実現しますか?
2. Garbage Collection
C、C++などの低レベル言語では手動クリーンアップメカニズムが用いられ、JavaScriptではゴミ収集(GC、Garbage Collection)と呼ばれる自動メモリ管理方法が用いられる.ごみ収集は、メモリ管理を実行するために達成性(readability)概念を使用します.ここで、「到達可能」(readable)値は、参照によってアクセスまたは使用できる値を意味し、「到達可能」値はメモリから解放されません.
したがって、現在の関数の領域変数|パラメータ、ネストされた関数チェーンの関数で使用される変数|パラメータ、グローバル変数など、明確な理由がなければメモリは解放されません.
3.Garbage Collectionでのメモリ管理メカニズム
3-1)参照カウント方法
不要なオブジェクトを他のオブジェクトに参照されないオブジェクトとして定義することでメモリを解放します.次の図に示すように、いくつかのオブジェクトが参照されているとします.
上図で参照されていないメモリはないため、不要なセットから解放されるメモリはありません.ここに参照できないメモリがある場合、メモリは不要なセットで解放されます.
※参照-カウントの欠点-ループ参照
上図では、赤い矢印で接続の参照を解除したとします.ではrootからオレンジメモリまではできませんが、オレンジメモリは相互参照の循環参照構造を形成します.
[参照カウント](Reference Count)メソッドでは、上記の循環参照構造のメモリは解放されません.
3-2) Mark and Sweep
不要になったオブジェクトを接触できないオブジェクト(Unreable)として定義し、メモリを解放します.この方法はルートオブジェクト(Javascriptではグローバル変数)から始まり,これをタッチ可能オブジェクトとタッチ不可オブジェクトに分ける.
この方式は3−1)参照カウントよりも有効である.上の図に示すように、ループリファレンス構造があってもルートからオブジェクトに接触できないため、メモリから解放されます.したがって、最新のブラウザでは、ゴミ収集でタグとクリア方式が使用されます.
※Mark and Sweepの欠点-手動解除
JAvascriptのGC自動管理メモリは、ルートディレクトリから参照可能なデータを直接削除しようとしても手動で解除することはできません.
3-2-1)マークとクリアの動作原理
3-1)参照カウント方法
不要なオブジェクトを他のオブジェクトに参照されないオブジェクトとして定義することでメモリを解放します.次の図に示すように、いくつかのオブジェクトが参照されているとします.
上図で参照されていないメモリはないため、不要なセットから解放されるメモリはありません.ここに参照できないメモリがある場合、メモリは不要なセットで解放されます.
※参照-カウントの欠点-ループ参照
上図では、赤い矢印で接続の参照を解除したとします.ではrootからオレンジメモリまではできませんが、オレンジメモリは相互参照の循環参照構造を形成します.
[参照カウント](Reference Count)メソッドでは、上記の循環参照構造のメモリは解放されません.
3-2) Mark and Sweep
不要になったオブジェクトを接触できないオブジェクト(Unreable)として定義し、メモリを解放します.この方法はルートオブジェクト(Javascriptではグローバル変数)から始まり,これをタッチ可能オブジェクトとタッチ不可オブジェクトに分ける.
この方式は3−1)参照カウントよりも有効である.上の図に示すように、ループリファレンス構造があってもルートからオブジェクトに接触できないため、メモリから解放されます.したがって、最新のブラウザでは、ゴミ収集でタグとクリア方式が使用されます.
※Mark and Sweepの欠点-手動解除
JAvascriptのGC自動管理メモリは、ルートディレクトリから参照可能なデータを直接削除しようとしても手動で解除することはできません.
3-2-1)マークとクリアの動作原理
4.整理
リファレンス
Reference
この問題について(Garbage Collection), 我々は、より多くの情報をここで見つけました https://velog.io/@apparatus1/Garbage-Collectionテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol