Dot-Net
.Net 為什麼我不能在 x64 程序中獲得超過 11GB 的分配記憶體?
我以為64位程序的最大使用者空間是8TB,但我做了一點測試,我能得到的最大使用者空間是10-11GB。
注意:我在程序中不需要那麼多記憶體,我只是想了解為什麼出於好奇。
這是我的測試程序:
static void Main(string[] args) { List<byte[]> list = new List<byte[]>(); while (true) { Console.WriteLine("Press any key to allocate 1 more GB"); Console.ReadKey(true); list.Add(new byte[1024 * 1024 * 1024]); Console.WriteLine("Memory size:"); double memoryUsage = Process.GetCurrentProcess().PeakVirtualMemorySize64 / (double)(1024 * 1024 * 1024); Console.WriteLine(memoryUsage.ToString("0.00") + " GB"); Console.WriteLine(); } }編輯:
更新了測試程序,使其更具確定性。
要接受答案,我想知道如果 8TB 只是理論上的,那麼實際分配的最大記憶體是如何計算的。
它高達8 TB,而不是 8 TB。您可能擁有最多 8 TB,但您需要匹配的 RAM/swapfile。
是你的機器。
我有一個帶有 8GB RAM 和 12GB 頁面文件的 x64,我執行了你的程序,它達到了 16.23GB。
結語:然後我的 Win7 安裝逐漸陷入昏迷,因為關鍵程序顯然記憶體不足。
編輯:如果您想了解 Windows 如何分配(即保留和送出)記憶體,請閱讀Pushing the Limits of Windows: Physical Memory和Pushing the Limits of Windows: Virtual Memory。
由於 .Net 依賴 Windows 來管理其用於建構 GC 堆的記憶體,因此 Windows 執行此操作的機制反映在 .Net 中低級別的記憶體分配方式中。