2009-03-31 22 views
0

ネストされた参照に関してガベージコレクションはどのようにスマートですか?.Net:ネストされた参照

は、例えば、このコードを取る:

Public Class SomeClass 
    Private m_SomeOtherClass(Me) 
End Class 

私はGCが残っていると、すべての参照なしに任意のオブジェクトがダンプされてしまうどのように多くの参考文献を見て、働くことを知っています。したがって、この場合、メンバ変数からの参照がある場合、IDisposableなどを実装しない限り、メモリリークが起こるのを待っていますか?それはおそらく、すべての参照がオブジェクト自体から来ているかどうかを確認し、ちょうど参照カウントに向けて、それらを数えることができませんでしたので、

今私は、GCは、このために十分にスマートであることを仮定しています。しかし、私は少し掘ると思った。

答えて

1

基本的な答えを、彼らは時間と空間の次元で互いに十分に接近し、割り当てられている場合はそれも、同時に両方のオブジェクトを収集します。

私は前に質問のこの種のを聞いた、それは、円形の参照が問題を提起し参照カウント、との混乱から生じます。

.NETコレクタは参照を数えず、参照されたオブジェクトのみをスキャンしてフラグを付けます。これらのフラグはまた、ループに入るのを防ぎます。これは非常にシンプルで事実上絶対不可欠な仕組みです。システムはインバウンド参照を数えたり追跡したりする必要がないため、短期間参照のオーバーヘッドはゼロになります。しかし、参照が存在する場所を常に監視しなければならず、一般的な問題はイベントを購読するオブジェクトです。このイベントは参照を保持しているので、購読中のオブジェクトを再生できるようになる前に購読を解除する必要があります。 GCのもう1つの利点は、ロジックが逆も働くことです。つまり、参照が有効であることが保証されている参照へのアクセス権がコードにある場合は、その参照が存在するからです。

参照カウントがコピー、コードを基準が変更されるたびに注入するコンパイラを必要とするか、または一定のオーバーヘッドを被る、スコープの外に出ます。カウントがゼロになると、オブジェクトは直ちに破壊されます。システムはサイクルを(手動で)処理する機構を必要とする。 COM IUnknownインターフェイスを検索することで、いくつかのホラーストーリーを見つけることができます。

+0

それは根のセットから始まり、歩き出し、参照されていないものはすべて行きます。そして、実際には参考文献を数えているわけではありません。 –

+0

さて、私は少し答えを広げます。 –

4

これは絶対に問題ありません。 GCは根のセット(ローカル変数や静的変数など)から作業し、できるすべての参照を見つけます。この相互参照オブジェクトを他のものが参照していない場合、そのオブジェクトはコレクションの対象となります。

+0

つまり、子オブジェクトは親と同じルートを共有しているため、自己参照としてカウントされます。 –

+0

まあ、そうかもしれません。子オブジェクト*は他の場所から直接参照される可能性がありますが、その場合は "親"オブジェクトが生き続けるでしょう。基本的には正しいことが起こります:) –

+0

偉大な、答えのおかげでジョン! –

1

GCはスマートです。それは問題ではない。)

関連する問題