malloc возвращает NULL и устанавливает errno в ENOMEM, но достаточно ли места в куче? - PullRequest
3 голосов
/ 03 декабря 2011

У меня есть ситуация, в которой malloc() возвращает NULL и устанавливает errno в ENOMEM. Но в куче CRT (которая может расширяться) достаточно памяти для работы. Во время malloc моя память процесса составляет около 900 МБ. Хост-процесс - это исполняемый файл Java, выполняемый в JVM Sun HotSpot.

malloc(), что я делаю, составляет 80 мегабайт, и не удается. Если я выделю 60 МБ, это удастся. После этого выделение 50 МБ, за которым следуют еще одно и еще одно , также успешно : очевидно, у меня все еще остается много памяти, но malloc 80 МБ кажется слишком «большим», чтобы его можно было переварить .

Я использую Windows 7 x64 SP1 с 4 ГБ ОЗУ. Мой процесс представляет собой 32-разрядный процесс, построенный с использованием VC ++ 2010 SP1. Я использую Кучу с низкой фрагментацией, которая используется по умолчанию в Win 7 - я также проверил с помощью HeapQueryInformation. Используемая мной среда выполнения VC2010 C создает кучу следующим образом:

HeapCreate(0, BYTES_PER_PAGE, 0)

Согласно документации HeapCreate, HeapAlloc автоматически вызовет VirtualAlloc для блоков размером более 512 КБ.

Что, черт возьми, может вызвать сбой malloc(), если это не недостаток памяти? Моя память слишком фрагментирована? Я думал, что Windows будет автоматически сжимать кучу. Это действительно странно, я никогда не видел такого поведения раньше.

То же поведение наблюдается и на другом компьютере с 32-разрядной версией Windows XP с пакетом обновления 3 (SP3).

Спасибо, Martin

...