3

多分それは私ですが、この(奇妙な)動作について疑問に思っています。

以下のスニペットを検討してください。これは、効果を説明するための最小限のコンソール プログラムです。

class MyClass { }

class Program
{
    static void Main(string[] args)
    {
            var x = new MyClass();
            var y = new MyClass();

            x = null;
            GC.Collect();

            Console.ReadKey();
    }
}

プログラムがキーを押して (またはブレークポイントを配置して) 停止すると、メモリ プロファイラーは 2 つの「MyClass」インスタンスがまだ参照されていることを示します。

GC.Collect()役に立ちませんし、プログラムを「リリース」として実行することもできません。

MyClass少なくとも GC コレクションを強制することによって、参照されていないインスタンスをすぐに収集するべきではありませんか?

注: 大規模なコンソール アプリには、データを生成する一連のスレッドが含まれ、MyClass のようなインスタンスがコンシューマーとして機能します。インスタンスは 経由WeakReferenceで参照されますが、それは問題ではないようです。問題は、すべてのテスト ライフサイクルを Main メソッドで実行してもコンシューマーを破棄できないことです。

前もって感謝します。

4

2 に答える 2

1

GC.Collect()非同期で実行されます。同期的に実行するには、次を呼び出す必要があります。

GC.Collect();
GC.WaitForPendingFinalizers();
于 2013-03-22T11:29:47.660 に答える
1

GC.Collect(); すぐに完了するとは限りません。バックグラウンド スレッドを開始してすぐに戻るため、プロファイラーがチェックした瞬間に収集されない場合があります。

于 2013-03-22T11:28:31.633 に答える