Я использую Delphi 2009, в который встроен менеджер памяти FastMM4.
Моя программа считывает и обрабатывает большой набор данных. Вся память освобождается правильно, когда я очищаю набор данных или выхожу из программы. У него вообще нет утечек памяти.
Используя текущую процедуру CurrentMemoryUsage, приведенную в spenwarr, ответьте на: Как получить память, используемую программой Delphi, я отобразил память, используемую FastMM4 во время обработки.
Что, кажется, происходит, так это то, что использование памяти растет после каждого цикла процесса и выпуска. например:.
1,456 KB используется после запуска моей программы без набора данных.
218,455 KB используется после загрузки большого набора данных.
71,994 KB после полного удаления набора данных. Если я выйду из этой точки (или любой точки в моем примере), утечки памяти не сообщаются.
271,905 KB используется после загрузки одного и того же набора данных снова.
125,443 КБ после полного удаления набора данных.
325,519 KB используется после загрузки одного и того же набора данных снова.
179,059 KB после полного удаления набора данных.
378, 752 КБ, используемый после загрузки одного и того же набора данных снова.
Похоже, что использование моей программной памяти увеличивается примерно на 53 400 КБ при каждом цикле загрузки/очистки. Диспетчер задач подтверждает, что это действительно происходит.
Я слышал, что FastMM4 не всегда выводит всю память программы обратно в операционную систему, когда объекты освобождаются, чтобы сохранить память, когда ей нужно больше. Но это постоянное нарастание беспокоит меня. Поскольку никаких утечек памяти не сообщается, я не могу определить проблему.
Кто-нибудь знает, почему это происходит, если это плохо, и есть ли что-нибудь, что я могу или должен сделать?
Спасибо, Дортор и Мейсон, за ваши ответы. Вы заставили меня задуматься и попробовать что-то, что заставило меня понять, что я что-то упустил. Поэтому требуется подробная отладка.
Как оказалось, все мои структуры были правильно освобождены после выхода. Но освобождение памяти после каждого цикла во время прогона не было. Он накапливал блоки памяти, которые обычно вызывали утечку, которая была бы обнаружена при выходе, если бы моя очистка выхода была неправильной - но это было так.
Были некоторые StringLists и другие структуры, которые мне нужно было очистить между циклами. Я все еще не уверен, как моя программа работала правильно с дополнительными данными, которые все еще там были из предыдущих циклов, но это было сделано. Я, вероятно, буду исследовать это дальше.
На этот вопрос был дан ответ. Благодарим за помощь.