Ответ 1
Вы проверили, настроен ли ваш файл подкачки таким образом, чтобы он мог расширяться до этого размера?
Обновление
Я немного поиграл с вашим примером, и вот что я вижу.
Система: Windows 7 64 бит, 6 ГБ трехканальной ОЗУ, 8 ядер.
-
Вам нужен дополнительный файл подкачки на другом шпинделе из вашей ОС, или такое расследование будет шланги вашего компьютера. Если все сражается за один и тот же файл подкачки, это ухудшает ситуацию.
-
Я вижу, что большое количество данных продвигается из поколения в поколение в GC, а также большое количество сборок GC/коллекций и огромное количество ошибок страницы в результате, когда достигнуты физические ограничения памяти, Я могу только предположить, что когда физическая память исчерпана\очень высокая, это приводит к тому, что генерация подметает и продвигает, тем самым вызывая большое количество выгружаемой памяти, которая приводит к смерти, когда затронутая память выгружается и другая память вытесняется. Все это заканчивается сырым беспорядком. Это кажется неизбежным при распределении большого количества долгоживущих объектов, которые попадают в кучу мелких объектов.
Теперь сравните это с распределением объектов по модулю, выделив их непосредственно в кучу больших объектов (которая не подвержена таким же колебаниям и вопросам продвижения):
private static void Main()
{
const int MaxNodeCount = 100000000;
const int LargeObjectSize = (85 * 1000);
LinkedList<byte[]> list = new LinkedList<byte[]>();
for (long i = 0; i < MaxNodeCount; ++i)
{
list.AddLast(new byte[LargeObjectSize]);
if (i % 100000 == 0)
{
Console.WriteLine("{0:N0} 'approx' extra bytes allocated.",
((i + 1) * LargeObjectSize));
}
}
}
Это работает как ожидалось, то есть виртуальная память используется, а затем исчерпана - 54 ГБ в моей конфигурации\конфигурации.
Таким образом, кажется, что выделение массы долгоживущих мелких объектов в конечном итоге приведет к порочному циклу в GC, поскольку генераторные развертки и промоушн производятся, когда физическая память исчерпана - это спираль смерти файла страницы.
Обновление 2
Во время исследования проблемы я играл с несколькими опциями \configurations, которые не делали заметной разницы:
- Принудительный режим GC Server.
- Настройка GC с низкой задержкой.
- Различные комбинации принудительного GC, чтобы попытаться амортизировать GC.
- Рабочие наборы Min\Max.