.NETガベージコレクションとデバッグ:デバッグモードで変数が持続する理由
パズル:スコープがなく、参照されていないのに、なぜが完成していないのですか?
<code class="language-csharp">public class Class1 { public static int c; ~Class1() { c++; } } public class Class2 { public static void Main() { { var c1 = new Class1(); //c1 = null; // Uncommenting this doesn't change the output in debug mode. } GC.Collect(); GC.WaitForPendingFinalizers(); Console.WriteLine(Class1.c); // Prints 0 in debug mode, likely 1 in release mode. Console.Read(); } }</code>
デバッガーの影響c1
答えは、デバッガーのジャストインタイム(JIT)コンパイラへの影響にあります。 JITコンパイラは、テーブル追跡変数のライフサイクルを作成します。このテーブルは、ガベージコレクターの効率に不可欠です。 デバッグモードでは、JITコンパイラがこのテーブルを変更します。 囲まれた方法が完了するまで、ローカル変数を生かし続けます。 これにより、論理的に必要でなくても、変数がデバッグにアクセスできるようになります。 したがって、スコープが外れているにもかかわらず、
はデバッグモードで持続します。
リリースモードの動作c1
予想されるごみ収集動作を観察するには、コードをリリースモードで実行します(JIT最適化を有効にして)。 おそらく1への増分が表示され、
が完了していることを示しています。にClass1.c
に明示的に設定しても、この結果はリリースモードでは変更されません。
c1
結論:デバッグvs.リリースc1
null
デバッグモードとリリースモードの不一致は、重要な違いを強調しています。 デバッグツールは、ガベージコレクターの動作を変更します。 開発者は、デバッグ中にメモリ管理を分析する際にこれに注意する必要があります。 リリースモードでメモリ関連のコードを常に検証して、正確なごみ収集を確保し、生産における予期しない動作を回避してください。
以上がGarbage Collectionが.NETデバッグモードで変数を完成させないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。