次のコードを実行します
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回目の処刑後も状況は同じです。
なぜそれが起こるのですか?この場合、「コンパクト」操作が実行されないのはなぜですか?
ありがとうございました。