2012-02-15 8 views
3

.NET GCの3世代にファイナライザキューがありますか、それとも2世代だけには存在しますか?私は、第2世代だけがファイナライザキューとf-reachableキューを持っていると仮定しています。3つのガベージコレクションの世代すべてに.NETのファイナライザキューがありますか?

+0

FYI、質問はあなたが、それは非常に有用だった記事のために満足して –

+0

Plsのは、答えのいずれかを受け入れるとは何の関係もありません。それは私がプロファイラなしでメモリの問題をチェックすることができるsos.dllに私を紹介しました。再度、感謝します。 –

答えて

2

これは説明が難しいですが、実際のCLRコードは.NETの文献にある説明とよく似ておらず、かなり畳み込まれています。 CLR内には、「finalization_queue」という名前の論理構造が1つあります。ただし、生成可能なオブジェクトを世代別に編成する内部構造を持っています。

これを表示するには、より良い方法があります。仮定が正しいとすれば、ジェネレーション#0の収集後にオブジェクトをファイナライズする方法はありません。それを試してみてください。

using System; 

class Program { 
    static void Main(string[] args) { 
     var obj = new Test(); 
     obj = null; 
     Console.WriteLine("before gen#0 collection"); 
     GC.Collect(0); 
     GC.WaitForPendingFinalizers(); 
     Console.WriteLine("after gen#0 collection"); 
     Console.ReadLine(); 
    } 
} 

class Test { 
    ~Test() { Console.WriteLine("finalized"); } 
} 
+0

お返事ありがとうございます。 – veena

+0

興味深いことに、メモリが世代2に昇進し、次にファイナライザ・キューに昇進してから収集された(または)世代0がキューを持ち、収集されたかどうか – veena

関連する問題