4

次のコードを実行します

        StringBuilder sb = new StringBuilder();
        Stack  stack = new Stack();
        SynchronizationContext sc = new SynchronizationContext();

        GC.Collect();
        Console.WriteLine("GC. First Execution.");

        stack = null;

        GC.Collect();
        Console.WriteLine("GC. Second Execution.");

        GC.Collect();
        Console.WriteLine("GC. Third Execution.");

このコードを SOS でデバッグすると、GC アドレスの最初の実行後に次のようになることがわかります。

!dso
...
0239b5f8 System.Threading.SynchronizationContext
0239b5a8 System.Collections.Stack
0239b560 System.Text.StringBuilder
...

2 回目の実行後、ヒープに「スタック」オブジェクトはありませんが、他のアドレスは次のとおりです。

!dso
...
0239b5f8 System.Threading.SynchronizationContext
0239b560 System.Text.StringBuilder
...

そのため、「スタック」オブジェクトは収集されましたが、sc (SynchronizationContext) オブジェクトは圧縮対象のメモリに再配置されませんでした。記憶にギャップがある

!do 0239b5a8
Free Object
Size:        80(0x50) bytes

3回目の処刑後も状況は同じです。

なぜそれが起こるのですか?この場合、「コンパクト」操作が実行されないのはなぜですか?

ありがとうございました。

4

1 に答える 1

3

GC は効率的であることを怠っています。実際には解放されないか、必要になるまで「コンパクト」と言うようにはなりません。オブジェクトは廃棄キューに移動されました。

何日も待っても、クリーンアップが見られません。リソースが少なく、必要なときにクリーンアップします。

于 2012-02-07T09:29:36.803 に答える