Во-первых, меня немного смущает терминология: почему существует некоторая память, выделенная FastMM, и некоторая память, выделенная системой (и зарезервированная)?Поскольку FastMM является диспетчером памяти, почему система отвечает за выделение части памяти?
Как вы думаете, где FastMM получает память для выделения?Конечно, это происходит из системы.
Когда ваше приложение запускается, FastMM получает блок памяти из системы.Когда вы запрашиваете какую-то память для использования (будь то с GetMem, New или TSomething.Create), FastMM пытается передать ее вам из этого первого начального блока.Если там недостаточно, FastMM запрашивает больше (в одном блоке, если возможно) из системы и возвращает вам часть этого.Когда вы что-то освобождаете, FastMM не возвращает эту память в ОС, потому что полагает, что вы будете использовать ее снова.Он просто помечается как неиспользованный внутри.Он также пытается перераспределить неиспользуемые блоки так, чтобы они были как можно более смежными, чтобы не приходилось возвращаться к ОС более без необходимости.(Однако такая перестройка не всегда возможна; вот где вы в конечном итоге получаете фрагментацию памяти от таких вещей, как многократное изменение размера динамических массивов, создание и освобождение большого количества объектов и т. Д.)
В дополнение кПамять FastMM управляет в вашем приложении, система выделяет место для стека и кучи.Каждый процесс получает по миллиону стекового пространства при запуске, как место для размещения переменных.Этот стек (и куча) может динамически расти по мере необходимости.
Когда ваше приложение завершает работу, вся выделенная память высвобождается обратно в ОС.(Возможно, это не так сразу отображается в диспетчере задач, но это так.)
Можно ли, например, получить отчет в середине исполнения, аналогичный тому, что FastMM генерирует при закрытии приложения?
Не настолько, насколько я могу судить.Поскольку FastMM хранит его где-то, это не обязательно означает, что есть способ получить к нему доступ во время выполнения за пределами диспетчера памяти.Вы можете посмотреть на источник для FastMMUsageTracker, чтобы увидеть, как информация извлекается (используя GetMemoryManagerState и GetMemoryMap, в методе RefreshSnapshot).Источник для FastMM4 также доступен;вы можете посмотреть, какие общедоступные методы доступны.
Собственная документация FastMM (в виде файлов readme, комментариев FastMM4Options.inc и файла FastMM4_FAQ.txt) в некоторой степени полезна для объяснения того, какработает и какие варианты отладки (и информация) доступны.