2011-08-08 13 views
2

私はSystem.Diagnostics.Processを使用しています。 PeakWorkingSet64を使用して、プロセスの現在のメモリ使用量を取得します。 このプロセスは、8,10、さらに12GBに達することができます(要求しません)。 私の問題は、私がプロセスPeakWorkingSet64に問い合わせると、それが4096mbにあるまでうまく動作するということです。PeakWorkingSet64は、私に適切な結果を与えません。

私のコードは次のとおりです。

p.Refresh();

int m = (int)(p.PeakWorkingSet64 /(float) 1024 /(float) 1024);

すべてのヘルプは、暗闇の中で

+0

私はあなたが尋ねないと言ったが、12GMは何ですか?あなたは 'm'が12GMのために何を期待していますか? –

+0

どのくらいの物理メモリがありますか? –

+0

24GB :)物理メモリ – Noam

答えて

3

ショットにappriciatedされるだろう...

あなたは4ギガバイトで限界いっぱいまでだが、あなたはの24ギガバイトを持っています物理メモリ。 4GBは、32ビットプロセスが64ビットWindows OS上に持つユーザーアドレス空間の最大量です。プログラムを明示的に64ビットプロセスとして実行してみてください。 32ビットプロセスとして動作していることがわかります。

VS:プロジェクトのプロパティ - >ビルド - >プラットフォームターゲット:x64の

更新

のx64に私のプラットフォームを設定した後、私のシステム上で次のコードは、4ギガバイトワーキングセットを超えます。私は6GBのメモリを搭載したシステムでテストしているので、それを上回ることはありません.4.2GBを超えるだけのメモリがありません。私は24GBのメモリを備えたサーバーを持っていますが、このテストのためにそれをホースするのは嫌です! :)

あなたは、これが仮想メモリ使用状況、およびない物理メモリ使用量の合計であることを、あなたはあなたのプログラムを使用して、システムに12ギガバイトのRAM使用量を見ていると言うとき、私はあなたのコメントに推測しています。 PeakWorkingSet64は物理メモリを参照します。

私は、生成されたデータが高温で物理メモリに保存され、ページアウトされないようにするために、コードにいくつかの手掛かりを付けました(ページアウトされたメモリは、ページングファイル、および実際の物理メモリには含まれません)。タッチされていない場合、Windowsは積極的にメモリをディスクにページングします。

 Console.WriteLine("Is64=" + (Marshal.SizeOf(IntPtr.Zero) == 8)); 

     Process p = Process.GetCurrentProcess(); 

     List<int[]> data = new List<int[]>(); 

     while (true) 
     { 
      int[] buffer = new int[1024 * 1024 * 128]; //<- 0.5GB 

      data.Add(buffer); 

      int touch = 0; 

      foreach (var b in data) 
      { 
       for (int i = 0; i < b.Length; i++) 
       { 
        touch += b[i]; 
       } 
      } 

      p.Refresh(); 

      int mb = (int)(p.PeakWorkingSet64/(float)1024/1024); 

      Console.WriteLine("ignore" + touch); 

      Console.WriteLine(mb + "MB"); 

      Thread.Sleep(1 * 1000); 
     } 

出力:

IGNORE0
524メガバイト
IGNORE0
1055メガバイト
IGNORE0
1560メガバイト
IGNORE0
2074メガバイト
IGNORE0
2587メガバイト
IGNORE0
3101メガバイト
IGNORE0
3615メガバイト
IGNORE0
4132メガバイト
IGNORE0
4188メガバイト

重要な注意

することを確認してくださいPeekWoを使用するプロセスrkingSet64は64ビットプロセスです。私の驚いたことに、別の64ビットプロセスのPeekWorkingSet64を取得しようとする32ビットプロセスは、監視されたプロセスが64ビットであり、それ以上の物理メモリを保持していても、最大メモリ使用量として4096MBしか得られません。

+0

+1:そうです私の推測さえありました。しかし、営業担当者は、プロセスが8〜12 GBに達することができると述べています。しかし、それが起こったことはないが、推定だけだった場合、はい、それは良い呼び出しです。 –

+0

@Christian私はOPが8GBと12GBの仮想メモリを見ていると仮定していますが、PeakWorkingSet64は* physical *メモリを返します。 –

+0

しかし、仮想メモリには32ビットプロセスで同じ制限(〜4GB)がありますね。 –

0

ワーキングセットは、アプリケーションで実際に表示される物理メモリの量です。 Windowsはすべての実行中のプロセスからページを盗み出しています。あなたがそれらにアクセスしようとすると、あなたはそれらを戻します(これはソフトフォールトと呼ばれます)。

他のユーザーがメモリを必要とする場合、ページはスワップファイルに書き込まれ、ゼロ化されて再利用されます。

したがって、アプリケーションで使用されている物理メモリは、ワーキングセットよりも大きくなる可能性があります。ウィンドウで「借りた」ページはカウントされません。

Windowsには、ワーキングセットのプロセスごとの制限があります。 32ビットアプリケーションの場合、これは1.3GBでした。これをプロセスエクスプローラで照会することができます。ちょうど多分64ビットのこの値は4GBです、私は知らない。あなたが記述したプロセスでは、この制限を上げることは価値があるかもしれないので、ウィンドウはプロセスのメモリフットプリントをトリムしようとするのを止めます。

メモリの使用を抑制したい場合は、プロセスで使用されている仮想メモリの総量を確認する必要があります。

関連する問題