OUT OF MEMORY только при достижении виртуального лимита? - PullRequest
3 голосов
/ 05 октября 2009

Как я знаю в win32, каждая программа получает, скажем, 4 ГБ виртуальной памяти. Диспетчер памяти отвечает за разгрузку фрагментов памяти из физической памяти на диск.

Означает ли это, что malloc или любой другой API распределения памяти будет генерировать исключение OUT_OF_MEMORY только при достижении виртуального лимита? Я имею в виду, возможен ли сбой malloc, даже если программа далека от своего виртуального предела размера, например никакая физическая память не может быть выгружена на диск. Предположим, диск имеет неограниченную емкость и никаких конкретных ограничений не установлено.

Ответы [ 4 ]

11 голосов
/ 05 октября 2009

Да, это возможно. Помните, что память может быть фрагментирована и что malloc не сможет найти достаточно большой кусок, чтобы соответствовать требуемому размеру. Это может быть легко до того, как вы достигнете лимита в 4 ГиБ.

6 голосов
/ 05 октября 2009

Ограничение виртуальной памяти на Win 32 составляет 2 ГБ. На Win 64 это намного больше.

malloc не выдает исключение - возвращает NULL. Возвращаемое значение NULL или исключение, менеджер памяти может дать сбой задолго до того, как будет достигнут предел 2 Гб, если

  • Файл подкачки недостаточно велик. Если файл подкачки ограничен либо политикой, либо отсутствием места для расширения: если выделение памяти не может быть выполнено из-за доступности файла подкачки, то это приведет к ошибке.

  • фрагментация. Базовый менеджер памяти распределяет память по 4Kb. Вполне возможно, что через шаблоны распределения и освобождения можно получить небольшой объем выделенной памяти, но фрагментированную виртуальную память, что означает отсутствие смежной области, достаточно большой для удовлетворения конкретного запроса.

1 голос
/ 05 октября 2009

Полную главу и стих о виртуальной памяти Windows можно найти в этом посте в блоге Марка Руссиновича (здесь много других замечательных вещей):

Расширение границ Windows: виртуальная память

Если фрагментация памяти - ваша проблема, а написание пользовательских распределителей - не ваша задача, вы можете включить низкую кучу фрагментации:

Куча низкой фрагментации (Windows)

В настоящее время эта функция включена по умолчанию.

0 голосов
/ 05 октября 2009

как насчет выделения нескольких небольших областей, если огромная недоступна?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...