1

.Net AppDomain クラスのMonitoringSurvivedMemorySizeプロパティを利用しようとしています。

唯一の問題は、アプリケーションがこのプロパティから受け取る値が、msdn で指定されたプロパティの説明にどのように適合するかがわからないことです。

私が観察した不一致は、返された値が以前の呼び出しによって返された値と異なり、それらの 2 つの呼び出しの間に AppDomain によって参照されたメモリの量が決して低くなかったために、小さすぎることがわかっている値を返すプロパティで構成されています新しい戻り値。

SO、google、connect.microsoft.com で「AppDomain Monitoring」を検索しましたが、上記のこの特定の問題に関連すると思われるものは見つかりませんでした。

これが私のアプリケーションの他の部分で何もしないようにするために、次のコードで新しい ConsoleApplication を作成しました。

class Program
{
    static void Main(string[] args)
    {
        Console.WindowWidth = 133;

        AppDomain.MonitoringIsEnabled = true;

        var Queue = new Queue<byte[]>();

        var BlockSize = (int)1e+6; 

        var ToggleAllocation = true;

        while (true)
        {
            if (Console.KeyAvailable)
            {
                var Input = Console.ReadKey(true);

                if (Input.Key == ConsoleKey.Escape)
                {
                    break;
                }

                if (Input.Key == ConsoleKey.C)
                {
                    GC.Collect();
                    Console.WriteLine("Collect");
                }

                ToggleAllocation = !ToggleAllocation;
            }

            Thread.Sleep(100);

            if (!ToggleAllocation)
            {
                continue;
            }

            Queue.Enqueue(new byte[BlockSize]);

            while (100 < Queue.Count)
            {
                Queue.Dequeue();
            }

            var ExpectedLowerBound = Queue.Count * BlockSize;

            var MonitoringSurvivedMemorySize = AppDomain.CurrentDomain.MonitoringSurvivedMemorySize;
            var MonitoringTotalAllocatedMemorySize = AppDomain.CurrentDomain.MonitoringTotalAllocatedMemorySize;

            Console.WriteLine(
                "Queue.Count=" + Queue.Count.ToString() +
                ", SurvivedMemorySize=" + MonitoringSurvivedMemorySize.ToString() +
                ", TotalAllocatedMemorySize=" + MonitoringTotalAllocatedMemorySize.ToString() +
                ", ExpectedLowerBound=" + ExpectedLowerBound.ToString());
        }
    }
}

この関数は、gc が最終的に発生するように時々メモリを割り当て、MonitoringSurvivedMemorySize が受け取った値を出力するだけです。

問題がデバッガーの「機能」によるものではないことを確認するために、プロジェクトをデフォルトのリリース構成に切り替え、エクスプローラーからプログラムを実行しました。

このプログラムを実行すると、いくつかの反復でMonitoringSurvivedMemorySizeが 0 を返し、いくつかの反復の後 (最初の gc の後であると仮定します)、私の期待を満たすより高い値を返します。しかし、さらに数回繰り返した後、戻り値はゼロに戻ります。また、ゼロとは異なる値を返しますが、場合によってははるかに低い値を返します。

Target フレームワークを「.NET Framework 4 Client Profile」に設定しました

私は何を間違っていますか?

再現できますか?

4

2 に答える 2

0

ドキュメント(提供したリンクから)によると、完全なブロッキングコレクションの後にのみ更新された統計を期待する必要があります。テスト リグにGC.Collectへの呼び出しを追加してみてください。

于 2012-09-26T08:35:30.117 に答える