У меня есть ситуация, в которой 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