malloc возвращает NULL и устанавливает errno в ENOMEM, но достаточно ли места в куче?
У меня есть ситуация, в которой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 Run-Time, который я использую, создает кучу следующим образом:
HeapCreate(0, BYTES_PER_PAGE, 0)
Согласно документацииHeapCreate
, HeapAlloc
автоматически позвонитVirtualAlloc
для блоков размером более 512 КБ.
Что, черт возьми, может вызватьmalloc()
потерпеть неудачу, если это не недостаток памяти? Моя память слишком фрагментирована? Я думал, что Windows будет автоматически сжимать кучу. Это действительно странно, я никогда не видел такого поведения раньше.
Другой компьютер с 32-разрядной Windows XP SP3 демонстрирует такое же поведение.
Спасибо мартин