Я понял это - это куча CRT, которая выделяется при вызовах на malloc
.Если вы выделяете большой кусок памяти (например, 2 МБ), используя malloc
, он выделяет один зафиксированный блок памяти.Но если вы выделите более мелкие блоки (скажем, 177 КБ), то он зарезервирует 1 МБ памяти, но выделит только приблизительно то, что вы просили (например, 184 КБ для моего запроса 177 КБ).
Когда вы освобождаете этот маленький блок, этот больший блок размером 1 МБ не возвращается в ОС.Все, кроме 4k, не передано, но полный 1 МБ по-прежнему зарезервирован.Если вы снова позвоните malloc
, он попытается использовать этот блок размером 1 МБ для удовлетворения вашего запроса.Если он не может удовлетворить ваш запрос памятью, которая уже зарезервирована, он выделит новый фрагмент памяти, который вдвое больше предыдущего (в моем случае это было от 1 МБ до 2 МБ).Я не уверен, продолжается ли эта схема удвоения или нет.
Чтобы вернуть вашу освобожденную память в ОС, вы можете позвонить _heapmin
.Я бы подумал, что это сделает будущее большое выделение с большей вероятностью успешным, но все это будет зависеть от фрагментации памяти, и, возможно, heapmin уже будет вызван в случае сбоя выделения (?), Я не уверен.Это также приведет к снижению производительности, так как heapmin освободит память (что займет время), и тогда malloc потребуется перераспределить ее из ОС при необходимости снова.Эта информация относится к Windows / 32 XP, ваш пробег может отличаться.
ОБНОВЛЕНИЕ: В моем тестировании heapmin абсолютно ничего не делал.А куча malloc используется только для блоков размером менее 512 КБ.Даже если в куче malloc есть МБ непрерывного свободного пространства, он не будет использовать его для запросов более 512 КБ.В моем случае эта освобожденная, неиспользованная, но зарезервированная память malloc поглотила огромные части 2 ГБ адресного пространства моего процесса, что в итоге привело к сбоям выделения памяти.И поскольку heapmin не возвращает память в ОС, я не нашел решения этой проблемы, кроме перезапуска процесса или написания собственного менеджера памяти.