2012-02-22 39 views
14

私は、C#のプログラムで、メモリ使用量を測定しようとしています。C#でメモリ使用量を測定するにはどうすればいいですか?

私はこのJava関数のC#の同等のものを知りたい:ヒープにを割り当てられたメモリの合計を表す

ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getCommitted() 

を。私はC#のプログラムのために割り当てられたメモリの合計サイズを知るために必要です。

は、次にJavaで私が使用しているメモリを得ることができます:

ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed() 

は、現在、私が使用しているメモリを取得するためにC#でこれを使用:

Process_Memory = MyProcess.PrivateMemorySize64; 

をしかし、私はそれがだとは全くわからないんだけど同等。

したがって、私のC#アプリケーションと現在の使用の合計割り当て領域を取得するにはどうすればよいですかt

EDIT:

回答や今後の研究から、私はこれを決定しました:

現在使用中のメモリ

System.GC.GetTotalMemory(false); 

番号を付けを現在のバイト数yは管理されたメモリに割り当てられます。 (http://msdn.microsoft.com/fr-fr/library/system.gc.gettotalmemory.aspx

この方法は、低値を返し、私はそれが私がgetUsed()でJavaを得ることができるよう、実際に使用されているすべてのメモリの表現ではないだと確信しています。同じアプリケーションのJavaでは、メモリは5MBで開始し、最大125MBになります。 C#の場合、上記の方法で1〜5 MBが得られます。

ようです:

MyProcess.PrivateMemorySize64; // return ~=25MB 

または

MyProcess.WorkingSet64; //return ~=20MB 

は、使用中のすべてのメモリのより正確な値を与えます。しかし、私は私が使用すべきものを知りません...

グローバルに割り当てられたメモリthis articleのために使用することが示唆:

Process_MemoryEnd1 = MyProcess.VirtualMemorySize64; 

それはその169メガバイトについては、プログラムの開発に沿って常に同じ値を返しますJavaと比較して公平だと思われる:64MBから170私はまだ私が見つけたすべては非常にあいまいであると私は、Windowsのメモリ管理に精通していないよ、私は私が見つけたドキュメントをundertandて本当にわからないんだけど、正確な答えを探していますMB最大

:/

答えて

9

GC静的クラスは、このような情報をすべて提供します。

おそらくGC.GetTotalMemory()以降です。

EDIT:

私はワークアウトにしようと、あなたのメモリフットプリントは、現在根ざしたオブジェクトに基づいていることを信じて。 プロセスに割り当てられた合計サイズ(空きバッファを含む)を使用する場合は、Processクラスを使用します。例えば:

Process.GetCurrentProcess().WorkingSet64; 
+0

はい、私はこれを知っているが、それ管理されたヒープ内のオブジェクトの実際のサイズを指定すると、値は小さくなります。私はこれがすべての割り当てられたメモリの代表だとは思わない。 –

+0

次に、未処理の割り当てメモリ(管理されたGC機能を考慮しない)を使用する場合は、 'Process'クラスのすべてのプロパティを使用するだけでよいと思います。 'PagedMemorySize64'、' PrivateMemorySize64'など – Tyson

+0

ありがとう、私はちょうどprocessusの合計割り当てメモリ 'PrivateMemorySize64'だけで十分だと思います。私はページングされたメモリを取得しません... –

13

相続人は一つの方法は、GC使用:System.Diagnostics.PerformanceCounterを使用して、代わり

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.");   
    } 

のかは、ワーキング・セット情報を取得する:

PerformanceCounter performanceCounter = new PerformanceCounter(); 

performanceCounter.CategoryName = "Process"; 

performanceCounter.CounterName = "Working Set"; 

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

Console.WriteLine(((uint)performanceCounter.NextValue()/1024).ToString("N0")); 
+0

答えをありがとう。したがって、docが言うように、 'GC.GetTotalMemory(false)'は現在管理対象メモリに割り当てられているバイト数を返します。私はそれがjavaのgetUse()と等価かもしれないと思います。しかし、全体のスペースをどのように確保するのですか? 'System.Diagnostics.Process.GetCurrentProcess()。PrivateMemorySize64'はその値を表しますか? –

+1

それは正しい、はい。 –

+0

2番目の解決策では、 'System.InvalidOperationException'を発生させました。 –

関連する問題