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