Как узнать, куда уходит моя память - PullRequest
5 голосов
/ 01 июня 2010

У меня возникла ситуация, когда цикл загрузки, а затем закрытия документа израсходовал несколько МБ ОЗУ. Эта память не просачивается, поскольку что-то владеет ею и очищает ее при выходе из приложения (Visual Leak Detector и инструмент Mac Leaks показывают соглашение по этому вопросу). Тем не менее, я хотел бы узнать, куда это идет. Я предполагаю, что это какой-то кэш в приложении, который заполняется при загрузке документа, но не освобождается при закрытии документа. Какие методы или инструменты я мог бы использовать, чтобы узнать, где производятся эти ассигнования?

UPDATE:

После публикации Ханса я добавил в приложение цикл для многократного открытия и закрытия документов. Я обнаружил, что после загрузки первой пары документов был начальный скачок в использовании памяти («Private Bytes»), но затем он больше не увеличивался каждый раз. Таким образом, это говорит о том, что новых распределений нет, и очевидное увеличение, скорее всего, будет связано с артефактом подкачки.

Я также более подробно рассмотрел инструменты на Mac, которые были полезны для наблюдения за распределением: создайте инструмент, состоящий из инструментов Allocations и Leaks, затем добавьте снимок кучи в начале и конце цикла. и в списке Heapshots он покажет все дельты распределения относительно последнего снимка. Это говорит о том, что на Mac распределение памяти увеличивалось , но это происходило из-за внутренних кэшей, таких как рисование CoreGraphics, над которыми у нас мало контроля.

Ответы [ 4 ]

4 голосов
/ 01 июня 2010

Если вы можете надежно воспроизвести это, вы сможете использовать отладочную кучу в MS CRT для устранения этой проблемы. Начните здесь: Обнаружение и изоляция утечки памяти

2 голосов
/ 01 июня 2010

Исходя из предположения, что вы на самом деле измеряли ОЗУ: конечно, это совершенно нормально. Ваша программа активно обращается к страницам виртуальной памяти при загрузке документа, они отображаются в ОЗУ. Они будут оставаться там до тех пор, пока другому процессу не понадобится отобразить страницы в ОЗУ. Некоторые операционные системы упреждают рабочий набор преимущественно, например, в Windows, когда окна приложения свернуты.

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

2 голосов
/ 01 июня 2010

Ну, на самом деле у вас есть утечка. Когда приложение выходит из системы, ОС очищает все ресурсы: ни одно приложение не дает утечки в том смысле, что после завершения работы память остается постоянно выделенной. XCode имеет инструмент, который поможет вам выявить утечки.
Смотреть под

Run->Run with performance Tool->Leaks
Это запустит ваше приложение с кодом, который поможет вам найти утечки.
0 голосов
/ 17 января 2012

Может быть кому-то полезно. Я подумал, что Xcode 4.2 с активированным обнаружением объектов-зомби (флажок в редактировании схемы) пожирает память как сумасшедшую - ~ 4 ГБ за минуту. Просто убедитесь, что это проверено в тех случаях, когда ваше приложение ест память, запущенную под XCode, и не делает иначе. Инструменты выделения памяти и утечки также ничего не дают.

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