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 демонстрирует такое же поведение.

Спасибо мартин

Ответы на вопрос(0)

Ваш ответ на вопрос