.NETフレームワークのゴミ回復メカニズムは、メモリ管理とメモリの漏れの防止にとって重要です。ただし、場合によっては、特にデバッガーを使用する場合、ごみ回復メカニズムが誤解される可能性があります。
次のコードフラグメントは例です:
このコードをデバッグモードで実行すると、変数C1がスコープを超えて引用されなくなった場合でも、クラス1.C出力が0であることに驚くかもしれません。これは、デバッガがゴミリサイクル動作を変更したためです。
<code class="language-C#">public class Class1 { public static int c; ~Class1() { c++; } } public class Class2 { public static void Main() { { var c1 = new Class1(); //c1 = null; // 取消此行注释,在Console.WriteLine调用时,输出为1。 } GC.Collect(); GC.WaitForPendingFinalizers(); Console.WriteLine(Class1.c); // 输出0 Console.Read(); } }</code>デバッガーのないリリースバージョンでは、JITコンパイラがコードを最適化し、テーブルを生成してローカル変数を追跡します。このテーブルを使用すると、ガベージリサイクルは、メソッドがまだ実行されていても、いつ変数を回復するかを判断できます。この例では、C1はその範囲の後に使用されなくなるため、Main()の前にリサイクルできます。
ただし、追加のデバッガーの場合、JITコンパイラはテーブルを変更して、メソッド実行中にローカル変数がアクティビティ状態を維持するようにします。これは、デバッグ中に変数が消えるのを防ぐためです。したがって、C1は完全なMain()メソッド中にアクティビティを維持し、リサイクルを防ぎます。
ゴミ回復に影響する別の要因は、変数をnullに設定することです。デバッグモードでは、JITテーブルは変数が使用されているとまだ考えているため、これは効果的ではありません。ただし、配布バージョンでは、変数はnullに設定されており、ごみ収集がオブジェクトへの参照がないことを認識できるようにします。これにより、リサイクルが可能になります。
これらの微妙なことを理解することは、メモリの漏れを回避し、.NETアプリケーションの効率的なメモリ管理を確保するために不可欠です。コードを実行し、デバッグモードと配布モードでゴミリサイクル行動を分析することにより、コードが予想どおりに実行されることを確認できます。
以上が.NETのデバッグモードとリリースモード間でガベージコレクションの動作が異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。