Моя первая задача - убедиться, что вы измеряете что-то важное. «Память» может означать много разных вещей. Существует огромная разница между нехваткой виртуальной памяти и нехваткой оперативной памяти. Существует огромная разница между проблемой производительности, вызванной перебивкой файла подкачки, и проблемой производительности, вызванной слишком большим давлением ГХ.
Если вы не понимаете, каковы взаимосвязи между ОЗУ, виртуальной памятью, рабочим набором и файлом подкачки, начните с чтения, пока не разберетесь во всем этом. То, как вы сформулировали вопрос, заставляет меня подозревать, что вы считаете, что виртуальная память и оперативная память - это одно и то же. Конечно, нет.
Я подозреваю, что вы делаете арифметику:
- У меня есть восемь процессов, каждый из которых потребляет 500 миллионов байтов виртуального адресного пространства
- У меня четыре миллиарда байтов оперативной памяти
- Поэтому я собираюсь получить исключение OutOfMemory
Этот силлогизм совершенно недействителен. Это силлогизм:
- У меня восемь литров мороженого
- У меня есть место для девяти четвертей мороженого в морозильной камере
- Поэтому, если я получу еще две четверти мороженого, что-то растает.
когда на самом деле у вас есть целый склад холодного хранения размером с склад. Помните, ОЗУ - это просто удобный быстрый способ хранить вещи рядом с тем, где вам это нужно, например, в холодильнике. Если у вас есть больше вещей, которые нужно хранить, кого это волнует, если у вас не хватает места на месте? Вы всегда можете заскочить по соседству и поместить вещи, которые вы используете реже, в долгосрочную заморозку - файл подкачки. Это меньше удобно , но ничего не тает .
Вы получаете исключение «недостаточно памяти», когда процесс исчерпывает виртуальное адресное пространство, а не когда используется вся оперативная память в системе. Когда вся оперативная память в системе израсходована, вы не получаете сообщение об ошибке, вы получаете производительность дерьма , потому что операционная система тратит все свое время на запуск содержимого с диска.
Итак, в любом случае, начните с понимания того, что вы измеряете и как работает память в Windows. То, что вы должны искать, это:
Не грозит ли какому-либо процессу использование более двух миллиардов байтов виртуальной памяти в 32-битной системе? Процесс получает только 2 ГБ виртуальной памяти (не ОЗУ, помните, виртуальная память не имеет ничего общего с ОЗУ: , поэтому его называют "виртуальным" - это не аппаратное обеспечение ) на win32, который адресуется код пользователя; Вы получите OOM, если попытаетесь использовать больше.
Не подвергается ли какой-либо процесс риску выделения огромного блока виртуальной памяти так, чтобы не было свободного смежного блока такого размера? Например, вы, вероятно, выделите десять миллионов байтов данных в одном массиве? Опять ООМ.
Это рабочий набор - то есть страницы виртуальной памяти процесса, которые * должны быть в оперативной памяти * из соображений производительности - всех процессов, меньших, чем объем оперативной памяти имеется в наличии? Если нет, то скоро вы получите молот, но не OOM.
Является ли ваш файл подкачки достаточно большим, чтобы обрабатывать страницы виртуальной памяти, которые могут быть выгружены на диск, если объем оперативной памяти начнет сокращаться?
Пока что ничего из этого не имеет отношения к .NET. Как только вы на самом деле определили, что существует настоящая проблема - ее может и не быть - тогда начните расследование, основываясь на том, что является реальной проблемой. Используйте профилировщик памяти, чтобы проверить, что делают распределитель памяти и сборщик мусора. Посмотрите, есть ли огромные блоки в куче больших объектов, или неожиданно большие графики живых объектов, которые не могут быть собраны, или что. Но используйте хорошие инженерные принципы: понимайте систему, используйте инструменты, чтобы исследовать фактические эмпирические показатели, экспериментируйте с изменениями и тщательно измеряйте их результаты. Не просто начните случайным образом подбирать магические IDisposable интерфейсы для нескольких классов и надеяться, что это сделает проблему - если она есть - исчезнет.