射擊......
你在4GB的杏,但你有24GB物理內存。 4GB是32位進程在64位Windows操作系統上的最大用戶地址空間量。嘗試將程序明確作爲64位進程運行。我的直覺是它作爲一個32位進程運行。
VS:項目屬性 - >建設 - >目標平臺:64
更新
我的平臺設置爲64後,我的系統上下面的代碼超過4GB的工作集。由於我在6GB內存的系統上進行測試,並沒有得到太多的提示,並且內存不足以超過〜4.2GB。我確實有一臺內存爲24GB的服務器,但我不願意爲此測試軟管它! :)
我猜您的評論時,你說你在你的系統,你的程序上看到12GB內存的使用,這是總虛擬內存的使用,而不是物理內存使用。 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
524MB
ignore0
1055MB
ignore0
1560MB
ignore0
2074MB
ignore0
2587MB
ignore0
3101MB
ignore0
3615MB
ignore0
4132MB
ignore0
4188MB
重要提示
請確保使用PeekWo過程rkingSet64是一個64位的進程。令我驚訝的是,即使被監控進程是64位並擁有比此更多的物理內存,試圖獲得另一個64位進程的PeekWorkingSet64的32位進程也只能獲得4096MB的最大內存使用量。
我知道你說過不要問,但是12GM是什麼?你對12GM有什麼期待? –
你有多少物理記憶? –
24GB :)物理內存 – Noam