2012-04-01 9 views
0

jitコンパイラおよびclrは、ヒープ内のオブジェクトを指すか、またはnullであるアプリケーションルートのリストを維持します。 GCはこれらのルーツからグラフを作成し、このグラフで参照されているヒープ内のすべてのオブジェクトをマークします。残りはゴミです。
私の質問です:どのように根がnullになるのですか?
明白なケースは、変数が明示的にコード内でnullに設定されている場合です。 しかし、もしそうでなければ? jit/clrはいつルートをnullに設定するのかを知っていますか?GCおよびアプリケーションのルート

+0

もう1つのケース:スコープを離れるときに、コードブロックに定義されているローカル変数が到達不能になると、関数のスタックフレームが緩やかになり、そのためこのオブジェクトが参照されます。 –

答えて

1

私の理解では、アプリケーションのルートに含まれるポインタは、がnullに設定されていません。これはちょっとした直感的な方法です(IMHO)。なぜなら、オブジェクトを処分する最も速い方法は、単にFATファイルシステムがファイルを削除するためにFATエントリをマークするのと同じように、単にポインタを取り除くことだと思われるからですディスク上のバイトにその 'ポインタ'を実際に追いかけることなく、それらをゼロに設定せずに。私はこのことに触れたインタビューの質問を見逃していました。私たちは日常的に心配している事柄には全く適応していませんが、少し読んでいます。

いずれにしても... Jeffrey Richterは12年前にこれに対処するMSDNの記事を書きました。彼の記事から、私は以下のことを学びました。

GCを実行すると、すべてのアプリケーションルートが到達不能オブジェクトを指しているとみなされます。ルートを歩いて、ヒープ上のオブジェクトに従います(または、有効なものを指し示していないことを発見します)。これは再帰的に行い、到達可能なオブジェクトの新しいグラフを作成します。その後、有効なオブジェクトを移動してポインタを修正します。その効果は、空きメモリをヒープの上部に統合することです。このプロセスのある時点で、到達可能なオブジェクトのグラフがアプリケーションルートにコピーされ、それらが置き換えられます。ヒープが圧縮される前または後にこの問題が発生するかどうかは不明です。

MSDN Magazineの12月12日号と1月号には、C#メモリ管理に関する記事も含まれています。私はそれを読んだことはありませんが、それを計画しています - それはすべてを明らかにするかもしれません。

関連する問題