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