Увеличение объема памяти.Ложная тревога или утечка памяти? - PullRequest
1 голос
/ 31 октября 2010

У меня есть графическая программа, в которой я создаю и уничтожаю одни и те же объекты снова и снова.Всего 140 объектов.Они удаляются и обновляются так, что их число никогда не увеличивается до 140. Это требование, так как это стресс-тест, то есть я не могу иметь пул памяти или фиктивные объекты.Теперь я уверен, что нет утечек памяти.Я также использую детектор утечки памяти, который не сообщает о каких-либо утечках.

Проблема заключается в том, что объем памяти программы продолжает увеличиваться (хотя и довольно медленно, медленнее, чем скорость, с которой объекты уничтожаются / создаются).Поэтому мой вопрос заключается в том, является ли увеличение занимаемой памяти сплошным признаком утечек памяти или иногда оно может быть обманчивым?

Ответы [ 5 ]

3 голосов
/ 31 октября 2010

Кажется возможным, что такое поведение может происходить из ситуации, в которой нет утечки.

Есть ли вероятность, что ваша куча становится фрагментированной ?

Скажем, вы делаете много выделений размером n. Вы освобождаете их все, и ваша библиотека C вставляет эти буферы в свободный список. Затем какой-то другой путь кода делает выделения меньше n, поэтому эти блоки в свободном списке разбиваются на более мелкие единицы. Затем следующая итерация цикла выполняет еще одну серию выделений размером n, и свободный список больше не содержит непрерывной памяти такого размера, и malloc должен запросить у ядра больше памяти. В конце концов, эти выделения «меньше, чем n» освобождаются так же, как и ваши «n -размерные», но если вы выполните достаточно итераций там, где существует фрагментация, я смогу увидеть процесс, постепенно увеличивающий объем памяти.

Один из способов избежать этого может состоять в том, чтобы выделить все ваши объекты один раз, а не продолжать выделять / освобождать их. Поскольку вы используете C ++, это может потребовать размещения нового или чего-то подобного. Поскольку вы используете Windows, я мог бы также упомянуть, что Win32 поддерживает с несколькими кучами в процессе, поэтому, если ваши объекты поступают из кучи, отличной от других выделений, вы можете избежать этого.

2 голосов
/ 31 октября 2010

Если объем процессов вашего приложения возрастает выше разумного предела, который зависит от вашего приложения и от того, что он делает, и продолжает увеличиваться до тех пор, пока в конечном итоге вы (не) исчерпаете виртуальную память, у вас определенно будет утечка памяти.

2 голосов
/ 31 октября 2010

Это зависит от того, используете ли вы CLR (или виртуальную машину с сборщиком мусора) или вы все еще находитесь в старом режиме (например, C ++, MFC и т. Д.)

Когда у вас есть GC вокруг- ты не сможешь сказать, только если ты проверишь это достаточно долго.GC может решить пока не чистить ваши объекты ... (есть способ заставить его)

В нативных приложениях, да, увеличение площади может означать утечку.

тамнекоторые инструменты (очень хорошие инструменты) для c ++, которые обнаруживают эти утечки (google devpartner или boundschecker)

Я полагаю, есть также некоторые инструменты для c # и Java.

1 голос
/ 01 ноября 2010

Попробуйте тесты выделения памяти, включенные в CRT: http://msdn.microsoft.com/en-us/library/e5ewb1h3%28VS.80%29.aspx

Они помогают много.

Но я заметил, что приложения, как правило, немного меняют потребление памяти, если взглянуть на некоторые факторы. Windows 7 также может создавать дополнительные отступы при выделении памяти для исправления ошибок: http://msdn.microsoft.com/en-us/library/dd744764%28VS.85%29.aspx

0 голосов
/ 28 августа 2015

Я настоятельно рекомендую попробовать Visual Studio 2015 (Community Edition бесплатно). Он поставляется с диагностическими инструментами, которые помогают анализировать использование памяти; позволяет делать снимки и просматривать кучу enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...