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 ответов

Другие вопросы по тегам