在Windows Server 2008 x64上運行帶有16GB內存的.NET應用程序。此應用程序需要獲取並分析大量數據(大約64GB),並將其全部保存在內存中。.NET垃圾收集器和x64虛擬內存
我期望看到的:進程大小從16GB擴展到64GB。 Windows使用虛擬內存根據需要將額外的數據分頁到磁盤或從磁盤分頁。這是經典的虛擬內存使用案例。
我實際看到的:進程大小限於物理內存量(16GB)。應用程序花費99.8%的時間在垃圾回收器中。
爲什麼我們的應用程序無法使用虛擬內存?這是配置.NET垃圾回收器還是Windows x64虛擬內存管理器本身的問題?我可以做些什麼來讓我們的應用程序使用虛擬內存,而不是僅限於物理內存?
謝謝。
- 布賴恩
更新:我已經寫了一個很小的程序表現出相同的行爲:
using System;
namespace GCTest
{
class Program
{
static void Main()
{
byte[][] arrays = new byte[100000000][];
for (int i = 0; i < arrays.Length; ++i)
{
arrays[i] = new byte[320];
if (i % 100000 == 0)
{
Console.WriteLine("{0} arrays allocated", i);
System.Threading.Thread.Sleep(100);
}
}
}
}
}
如果你想嘗試一下,一定要建立針對x64。您可能需要修改一些常量來強調系統。我看到的行爲是當進程達到16GB的大小時,進程陷入了困境。沒有錯誤消息或拋出的異常。性能監視器報告GC中的CPU時間百分比接近100%。
這不是不可接受嗎?虛擬內存系統在哪裏?
你用什麼來確定過程的大小? (讓我們先刪除簡單的選項:)) – Paolo 2010-06-22 14:40:10
Windows任務管理器中的「提交大小」。性能監視器中還使用「#總提交字節數」。我很確定我正在測量進程的虛擬內存大小,而不是物理工作集。 – brianberns 2010-06-22 16:03:33
我可以問明顯嗎?你是否真的需要立即將所有這些加載到內存中?是否有可能採取另一種方法並自行進行某種手動分頁? – CodingGorilla 2010-06-22 21:58:20