ショットに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しか得られません。
私はあなたが尋ねないと言ったが、12GMは何ですか?あなたは 'm'が12GMのために何を期待していますか? –
どのくらいの物理メモリがありますか? –
24GB :)物理メモリ – Noam