FastMM обнаруживает все утечки памяти - PullRequest
4 голосов
/ 18 декабря 2010

Кто-то недавно предложил ( Моя программа никогда не освобождает память. Почему? ), что моя программа теряет часть памяти. У меня FastMM настроен агрессивно, и он не сообщает об утечках памяти при завершении работы программы.

В любом случае, я хотел бы знать, могут ли быть утечки памяти, которые не обнаруживаются FastMM?

Обновление: я лично не использую Win API для выделения памяти. Но я боюсь, что некоторые сторонние компоненты, которые я использую (не так много), могут использовать его. Можете ли вы сообщить мне все возможные вызовы API, которые FastMM не может перехватить? Я сделаю поиск в моем коде для них. Спасибо.


Delphi 7, Win 7 32 бит
FastMM 4.97
Я не заинтересован в интерфейсах.

Ответы [ 6 ]

4 голосов
/ 18 декабря 2010

FastMM - это слой поверх управления памятью Windows.Очевидно, что если вы (или какой-либо компонент или что-то еще) используете API-интерфейсы Windows для выделения памяти, то такое распределение обходит FastMM, и вы не сможете его отслеживать.Кстати, менеджеры памяти Delphi сами используют эти API для выделения частей памяти.Поэтому, если вам нужно увидеть распределение на этом уровне, FastMM недостаточно - вы должны использовать такие инструменты, как AQTime и аналогичные (как я предлагал в предыдущем вопросе).

3 голосов
/ 18 декабря 2010

Существует несколько возможных причин: (которые относятся к любому диспетчеру памяти)

  • ваш основной цикл программы теряет память, но делает это с тем, что освобождается при завершении работы
    • самый простой случай - запись в заметку. Записка становится все больше и больше, но уничтожается при закрытии.
  • память выделена вне контроля fastmm
    • напрямую выделяется из windows
    • память выделена в dll и т. Д.
  • Heapfragmentation. Диспетчер памяти сохраняет большие выделенные блоки (например, потому что он все еще содержит небольшой% выделений). Результат: приложение не использует его, но оно также не доступно для ОС. Среда выполнения / память хранит его.
    • fastmm должен быть более устойчивым к этому явлению, но в случае сомнения попытайтесь напечатать информацию heapmanager, чтобы узнать, так ли это.
3 голосов
/ 18 декабря 2010

Нет, только утечки памяти, какая память была выделена FastMM.

РЕДАКТИРОВАТЬ: Возможно, ответ выглядит завернутым, но это не так!Если кто-нибудь проверит, как создается FastMM , то можно увидеть, что каждый указатель выделения памяти помещается (и выдается в FreeMem) в один из стеков (имеется больше стеков, зависит от объема памяти), поэтомуВ конце закрытия приложения FastMM проверяет только стеки, если что-то в стеках, и если это так, то сообщают об утечке памяти!

3 голосов
/ 18 декабря 2010

Я никогда не знал, что FastMM не может обнаружить утечку памяти.

2 голосов
/ 19 декабря 2010

Уже есть много хороших ответов, но один момент, который еще не был упомянут ...

Существует множество «утечек», которые не обнаруживаются большинством детекторов утечек памяти, поскольку память освобождена, но после этого она больше не используется. Например, объект сложен в TObjectList. Объект помещается в список объектов, но после того, как вы его используете, вы не освобождаете его. Они будут уничтожены при уничтожении списка объектов (когда приложение закрывается для примера, при условии OwnsObject = True). Поскольку объекты фактически освобождаются, объекты не «просочились», но все же заставляют ваше приложение с течением времени использовать все больше и больше памяти.

FastMM не будет сообщать о них, поскольку он только выполняет «полный прогон» анализа. Чтобы обнаружить их, вам нужен детектор утечки памяти, который позволяет выполнять частичные прогоны, то есть анализировать то, что «просочилось» между точкой A и точкой B во время выполнения. AQTime, о котором упоминал Юджин, разрешает подобные проверки. Но имейте в виду, что это требует небольшого анализа, потому что это даст много ложноположительных результатов (почти все операции "realloc" будут помечены как утечка).

2 голосов
/ 19 декабря 2010

FastMM не обнаруживает утечки памяти, которые не проходят через FastMM.

Это может включать вызовы GlobalAlloc из сторонних библиотек или библиотек DLL, которые вы используете.
Редактировать : MSDN от Microsoft имеет хороший список методов выделения памяти .

Это была фактически проблема, о которой я упоминал, о которой я упоминал в моем ответе на ваш предыдущий вопрос FastMM.

Вы можете использовать такой инструмент, как VMMap , чтобы отслеживать утечки памяти, которые FastMM не может обнаружить.

- Йерун

...