Запуск приложения .NET на Windows Server 2008 x64 с 16 ГБ ОЗУ. Это приложение должно извлекать и анализировать очень большой объем данных (около 64 ГБ) и сохранять их все в памяти за один раз.
Что я ожидаю увидеть: размер процесса расширяется с 16 до 64 ГБ. Windows использует виртуальную память для дополнительной записи данных на диск с диска. Это классический вариант использования виртуальной памяти.
Что я на самом деле вижу: размер процесса ограничен объемом физической памяти (16 ГБ). Приложение тратит 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. Возможно, вам придется немного изменить константы, чтобы подчеркнуть вашу систему. Поведение, которое я вижу, заключается в том, что процесс болит, когда он приближается к размеру 16 ГБ. Не появляется сообщение об ошибке или исключение. Мониторинг производительности сообщает, что% времени процессора в ГК приближается к 100%.
Разве это неприемлемо? Где виртуальная память?