Стратегия или инструменты для поиска проблем с использованием памяти без утечек в Delphi? - PullRequest
10 голосов
/ 18 октября 2011

Одно старое приложение стало много потреблять памяти после обновления сервера. Использование памяти, по-видимому, возрастает без ограничения до зависания программы.

Согласно FastMM4 и EurekaLog, утечки памяти нет (кроме 28 байт), поэтому я предполагаю, что вся память освобождается при завершении работы приложения.

Существуют ли какие-либо инструменты или стратегии, подходящие для отслеживания такого рода проблем с памятью?

Ответы [ 4 ]

8 голосов
/ 28 июня 2013

С сентября 2012 года существует очень простой и удобный способ обнаружения утечек памяти этого типа только во время выполнения.

FastMM4991 представил новый метод, LogMemoryManagerStateToFile:

Добавлен вызов LogMemoryManagerStateToFile.Этот вызов записывает сводную информацию о состоянии диспетчера памяти в файл: общий объем выделенной памяти, накладные расходы, эффективность и разбивка выделенной памяти по классу и типу строки .Этот вызов может быть полезен для отлова объектов, которые не обязательно протекают, но задерживаются дольше, чем должны.

Чтобы обнаружить утечку во время выполнения, вам понадобятся только эти шаги

  1. добавить вызов к LogMemoryManagerStateToFile('memory.log', '') в месте, где он будет вызываться с интервалами
  2. запустить приложение
  3. открыть файл журнала с помощью хвостовой программы (например, BareTail), котораябудет автоматически обновляться при изменении содержимого файла
  4. смотреть первые строки файла, они будут содержать выделения памяти, которые занимают наибольшее количество памяти
  5. , если вы видите класс или тип памятипостоянно растет число случаев, это может быть причиной вашей утечки
8 голосов
/ 18 октября 2011
  1. Растущее потребление памяти является проблемой приложения.Это не ошибка, которую может обнаружить FastMM4 или EurekaLog.С их точки зрения - приложение просто правильно использует память.
  2. Используя AQTime, MemProof (трудно найти, D7 - последняя поддерживаемая версия (?)), SleuthQA (аналогично MemProof) или аналогичные профилировщики памяти,вы можете отслеживать использование памяти вне приложения в режиме реального времени.
  3. Используя FastMM4, GetMemoryManagerState / GetMemoryManagerUsageSummary вы можете отслеживать использование памяти из приложения.Выведите эту информацию в файл трассировки и проанализируйте ее после запуска.Или сделайте простую функцию обертывания для одной из вышеперечисленных процедур, которая вернет текущее использование памяти.И вызовите его из IDE Debugger Evalute / Modify, добавьте в Watches или вызовите OutputDebugString и посмотрите текущее использование памяти.

Обратите внимание: если память используется какой-либо DLL, вы можете не увидеть ее использование памятииспользуя (3).Использование (2).

Анализируя использование памяти и задачи, выполняемые приложением, вы можете обнаружить, что приводит к повышенному использованию памяти.

2 голосов
/ 18 октября 2011

AQTime (коммерческий инструмент, который довольно дорогой) может сообщать об использовании вашей памяти вплоть до строки исходного кода, которая выделяет каждый объект. В случае очень больших сценариев использования памяти вам может потребоваться функция AQTime, которая может отображать количество объектов и размер (общий плюс размер отдельного экземпляра) для каждого объекта. AQTime отлично работал для меня, начиная с Delphi 7 и всех последующих версий, включая вашу версию (2006) и последние версии (XE и XE2).

По мере роста использования памяти программы AQTime можно использовать для получения «снимков» кучи времени выполнения, которую можно использовать для понимания использования памяти вашим приложением; Что создается и сколько существует каждого объекта. Даже когда нет утечек, понимание поведения приложения во время выполнения в терминах объектов, которые оно создает и управляет, очень важно, и AQTime - самый мощный инструмент, который я знаю для пользователей Delphi.

Если вы хотите перейти на Delphi XE / XE2, возможно, у вас уже есть облегченная версия AQTime, если так, проверьте ее. Если нет, я рекомендую вам попробовать их демо. Мне неизвестны какие-либо альтернативы с открытым или открытым исходным кодом, которые могут обеспечить такую ​​же функциональность.

Меньшую функциональность можно объединить вручную, написав множество сообщений трассировки, или используя режим полной отладки FastMM. Если бы вы могли записать полный дамп использования памяти в очень большой файл, вы могли бы написать некоторые инструменты для анализа и создания сводки. Проблема, с которой я столкнулся в этом случае в FastMM, заключается в том, что вы будете утоплены в подробной информации, без возможности извлечь именно сводную информацию, которая поможет вам понять вашу ситуацию. Таким образом, вы можете попытаться написать свой собственный инструмент для подведения итогов использования памяти. В одном приложении, в котором использовался ряд компонентов, которые, как я знал, будет использовать много памяти, я записал в свое приложение диалоговое окно, в котором отображалось текущее использование памяти этими большими объектами памяти.

0 голосов
/ 28 июня 2013

Вы когда-нибудь задумывались о утечке, которая вызывает IDE ... она такая огромная !!!

В моем случае (2 ГБ ОЗУ) я делаю следующее ... 1. Откройте IDE 2. Оставьте это свернутым в течение почти шести часов 3. Посмотрите, как физическая память используется

Результат: В то время как IDE против (помните, что я также делаю тест, свернув его), он получает все больше и больше оперативной памяти ... до тех пор, пока больше не освободится оперативная память. Он получает все 2 ГБ ОЗУ + все пространство на жестком диске Pagefile (у меня настроено до 4 ГБ) Менее чем за шесть часов (ничего не делая в IDE) он пытается использовать более 6 ГБ.

Это называется утечкой памяти в среде IDE ... я не пишу буквы в IDE, ничего не компилирую, даже не открываю проекты ... просто открываю IDE и минимизирую его ... оставляю компьютер ничего не делает около шести часов, а IDE потребляет 6 ГБ памяти.

Конечно, после этого IDE начинается с надоедливых сообщений SystemOutOfMemory ... и я должен убить его ... тогда все 6 ГБ освобождаются !!!

Когда, черт возьми, это будет исправлено?

Обратите внимание, у меня есть все исправления, я также тестировал без применения каждого исправления / исправления и т.д ...

Лучшее, что я получил, - это отключение некоторых параметров в Инструментах, таких как тот, который подчеркивает плохой код и т. Д. ... так почему, черт возьми, этот параметр имеет какое-то влияние ... Я ничего не печатаю в IDE (на тесты) ... и если он у меня отключен, утечка памяти значительно уменьшается ...

Конечно, если я использую IDE (пишу код для открытого проекта), даже не скомпилировав / не запустив его ... дело пойдет гораздо хуже ... утечка памяти до 6 ГБ может быть достигнута менее чем за час, иногда происходит после 15 минут копирования / вставки исходного кода.

Кажется, что в скором времени не будет решения !!!

Итак, я получил следующее решение, которое отлично работает: -Закройте IDE и открывайте его каждые 15 минут или меньше

Гадкое решение, я знаю ... но работает !!!

...