Dot-Net

.Net 為什麼我不能在 x64 程序中獲得超過 11GB 的分配記憶體?

  • August 6, 2019

我以為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 MemoryPushing the Limits of Windows: Virtual Memory

由於 .Net 依賴 Windows 來管理其用於建構 GC 堆的記憶體,因此 Windows 執行此操作的機制反映在 .Net 中低級別的記憶體分配方式中。

引用自:https://stackoverflow.com/questions/2052019