Как FreePascal Memory Manager работает с увеличенными массивами
Недавно я наткнулся на проблему в рамках проекта FreePascal, который я разрабатываю: приложению требуется массив поиска, который может стать очень большим во время выполнения (несколько миллионов записей). Каждый элемент массива имеет размер около 8 байт.
Я наблюдал следующее поведение моего приложения: если массив уже достаточно большой (~130 МБ), другое увеличение приведет к пику потребления памяти и, возможно, также к увеличению энергопотребления ОЗУ.
Насколько я читал, пик может быть объяснен внутренним поведением метода SetLength(), который выделяет память под размер нового массива, а затем копирует старый массив в новое место назначения в памяти.
Но при проверке внезапного увеличения используемой памяти казалось, что были ситуации, когда "старая" память не освобождалась, что приводило к удвоенному использованию оперативной памяти.
Мне удалось воспроизвести это поведение более четко, когда я поднял шаги, в которых массив был увеличен.
Чтобы избавиться от этой проблемы, я изменил диспетчер памяти на CMem, и проблема исчезла.
К сожалению, я не нашел четкого описания диспетчера памяти Free Pascal и могу только догадываться, что пространство "старого" (маленького) массива не используется, потому что встроенный диспетчер памяти хочет, чтобы куча была не фрагментированной все время, но я не мог доказать это.
Есть ли у кого-нибудь из вас источник, описывающий основные функции диспетчера памяти Free Pascal и диспетчера памяти C и / или различия между ними?
Большое спасибо, всего наилучшего
Alex