保守的なガベージコレクタ [編集]
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2013/05/17 21:24 UTC 版)
「マーク・アンド・スイープ」の記事における「保守的なガベージコレクタ [編集]」の解説
C言語やC++言語など、ガベージコレクタを仕様に含んでいないプログラミング言語でマーク・アンド・スイープを実行するには、マシンスタックやマシンレジスタ内にも参照がないかを確認する必要がある。しかし、通常マシンスタックやマシンレジスタの値が参照アドレスを表しているのか、ただの数値を表しているのかを区別することは出来ない。そこで、マシンスタックやレジスタ中の値は全て参照アドレス値であると解釈して、該当アドレスのオブジェクト回収を保留する。このような実装を保守的なガベージコレクタと呼ぶ。処理手順は以下のようになる。 まず、使用中であることが確実である参照を調べる。具体的には、スタック領域や定数領域にあるポインタ変数などである。見つかった参照から到達可能なオブジェクトに印をつける。 そして、このオブジェクトからの参照を順々にたどっていき、使用中のメモリやオブジェクトの一覧を作る。 この時、スタック上やオブジェクト内にある参照でないデータも、参照をあらわすデータと見なして処理を進める。使用中のメモリを誤って解放してしまうことの方が、解放しないことよりも圧倒的に問題なので、使用中かどうか疑わしいメモリは解放しないのが安全である。それゆえ、保守的と呼ばれる。 そうして、使用中でないことが確実なメモリの一覧を作り、それを解放する。 Boost C++ Library の shared_ptr など 参照カウント法のメモリ管理とは異なり、保守的なガベージコレクタでは、特定のライブラリやネイティブスレッドとの同時使用によりトラブルが起こることがあるので、注意が必要である。
※この「保守的なガベージコレクタ [編集]」の解説は、「マーク・アンド・スイープ」の解説の一部です。
「保守的なガベージコレクタ [編集]」を含む「マーク・アンド・スイープ」の記事については、「マーク・アンド・スイープ」の概要を参照ください。
- 保守的なガベージコレクタ [編集]のページへのリンク