web-dev-qa-db-ja.com

C#でメモリ使用量を測定する方法(Javaで実行できるように)?

C#プログラムで、メモリ使用量を測定しようとしています。

このJava関数に相当するC#を知りたいのですが:

_ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getCommitted()
_

これは、ヒープに割り当てられたメモリの合計を表します。 C#プログラムに割り当てられたメモリの合計サイズを知るためにこれが必要です。

次に、Javaで、使用済みメモリを次のように取得できます。

_ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed()
_

現在、C#でこれを使用して使用済みメモリを取得しています:

_Process_Memory = MyProcess.PrivateMemorySize64;
_

しかし、それが同等であるかどうかは完全にはわかりません。

では、履歴書で、C#アプリケーションに割り当てられた合計スペースと現在の使用量tを取得するにはどうすればよいですか?

編集:

答えとさらなる調査から、私はこれを決定しました:

現在使用中のメモリ

_System.GC.GetTotalMemory(false);
_

管理対象メモリに現在割り当てられているバイト数を指定します。 ( http://msdn.Microsoft.com/fr-fr/library/system.gc.gettotalmemory.aspx

このメソッドは低い値を返しますが、JavagetUsed()で取得できるため、実際には使用中のすべてのメモリを表したものではないと確信しています。同じアプリケーションのJavaで、使用されるメモリは5MBから始まり、最大125MBになります。 C#では、上記の方法で1〜5MBを取得します。

のようだ :

_MyProcess.PrivateMemorySize64; // return ~=25MB
_

または

_MyProcess.WorkingSet64;  //return ~=20MB
_

使用中のすべてのメモリのより正確な値を指定します。しかし、どちらを使うべきかわかりません...

グローバルに割り当てられたメモリこの記事 の使用をお勧めします:

_Process_MemoryEnd1 = MyProcess.VirtualMemorySize64;
_

プログラムに沿って常に同じ値を返します。これはJava:最大64MBから170MB

私はまだ正確な答えを探しています。私が見つけたのは非常にあいまいで、Windowsのメモリ管理にあまり詳しくないので、見つけたドキュメントを理解するかどうかはわかりません:/

16
alain.janinm

GC静的クラスは、このタイプのすべての情報を提供します。

おそらくGC.GetTotalMemory()の後。

編集:

現在ルート化されているオブジェクトに基づいて、メモリフットプリントを計算しようとしていると思います。プロセスに割り当てられた合計サイズ(つまり、空きバッファーを含む)が必要な場合は、Processクラスを使用します。例えば。:

Process.GetCurrentProcess().WorkingSet64;
9
Tyson

GCを使用した1つの方法は次のとおりです。

    public void Test()
    {
        long kbAtExecution = GC.GetTotalMemory(false) / 1024;

        // do stuff that uses memory here 

        long kbAfter1 = GC.GetTotalMemory(false) / 1024;
        long kbAfter2 = GC.GetTotalMemory(true) / 1024;

        Console.WriteLine(kbAtExecution + " Started with this kb.");
        Console.WriteLine(kbAfter1 + " After the test.");
        Console.WriteLine(kbAfter1 - kbAtExecution + " Amt. Added.");
        Console.WriteLine(kbAfter2 + " Amt. After Collection");
        Console.WriteLine(kbAfter2 - kbAfter1 + " Amt. Collected by GC.");         
    }

または、System.Diagnostics.PerformanceCounterを使用して、ワーキングセット情報を取得します。

PerformanceCounter performanceCounter = new PerformanceCounter();

performanceCounter.CategoryName = "Process";

performanceCounter.CounterName = "Working Set";

performanceCounter.InstanceName = Process.GetCurrentProcess().ProcessName;

Console.WriteLine(((uint)performanceCounter.NextValue()/1024).ToString("N0"));
16
Sean Thoman