Запуск приложения .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 ГБ. Нет сообщения об ошибке или исключение. Монитор производительности сообщает, что% процессорного времени в GC приближается к 100%.
Разве это не неприемлемо? Где система виртуальной памяти?