在具有 16GB RAM 的 Windows Server 2008 x64 上运行 .NET 应用程序。该应用程序需要获取和分析非常大量的数据(大约 64GB),并且一次将其全部保存在内存中。
我期望看到的:进程大小从 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%。
这不是不能接受吗?虚拟内存系统在哪里?