Подтвердить что ты не робот

Как я могу избавиться от резидентной грязной памяти в Objective-C?

Я смотрел видео Apple WWDC 2010 на Advanced Memory Analysis с инструментами, и от этого мне удалось найти много резидентной грязной памяти. Я понимаю, что наличие столь резидентной грязной памяти - плохая вещь (и, вероятно, объяснение для моего приложения так сильно сбой...), но я не уверен, как это исправить. Где я должен смотреть?

Инструменты показывают мне много потенциально полезной информации, которая выглядит как тарабарщина для меня, например:

% of Res  Type                      Resident Size
18%       VM_ALLOCATE (8192 pages)  32.00 MB

Это в категории "Грязные" - 32 МБ резидентной грязной памяти много на устройстве с 256 МБ, верно?:) Есть еще несколько больших кусков, подобных этому. Как мне отследить это обратно к моему коду от инструментов? Или я должен просто забыть Инструменты и искать конкретные проблемы в моем коде?

4b9b3361

Ответ 1

Вы видите этот 32 МБ кусок VM_ALLOCATE при работе на устройстве или в симуляторе?

Я спрашиваю, потому что, когда я играл с инструментом распределения в приложении OS X, над которым я работаю, я также заметил 32-мегабайтный кусок VM_ALLOCATE, и мне интересно, является ли это побочным продуктом работы в OS X. Запуск на устройстве может дать вам другой набор данных.

В общем случае, резидентная память - это память, которую использует ваше приложение, которая не выгружается на диск. В iOS отсутствует своп, поэтому резидентная память должна быть равна вашей площади виртуальной памяти.

Грязная память - это память, которую вы выделили и использовали. Грязная память должна быть меньше, чем резидентная память, потому что последняя включает код (ваш и фреймворки).

Я не уверен точно, что вы делаете в своем приложении, но я догадаюсь, что вы загрузили некоторые крупные активы из своего пакета и держите их. Не делайте этого, когда это возможно.

Существуют также API-интерфейсы, которые вы можете использовать при загрузке объектов NSData, которые используют технологию сопоставления памяти, а не грубую силу, считывая байты. Это может быть лучше, потому что позволяет ОС лениво читать страницы с диска. С NSData (поскольку он не изменяет), он также может быть достаточно умным, чтобы отмечать страницы как доступные только для чтения. Теоретически это ценный намек на ОС, что он может очищать эти страницы под давлением, поскольку он знает, что они не могут измениться. Прочтите документы для +[NSData dataWithContentsOfMappedFile:].

Для изображений, я помню, что читал что-то, что предлагало избегать imageNamed:, за исключением изображений, которые вы регулярно используете в своем приложении (то есть элементы пользовательского интерфейса). Особенно для больших изображений они могут оставаться в кеше, который у вас нет. (imageNamed: имел утечку в 2.x дней, но он был исправлен в 3.x и совершенно безопасен для использования сегодня.) Используйте imageWithContentsOfFile: для больших изображений и изображений, которые не являются повторяющейся частью вашего интерфейса.

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

Ответ 2

С новым xCode 4 инструменты, идущие от xCode 3, все еще существуют с лучшим пользовательским интерфейсом для профилирования вашего приложения, включая утечки и использование памяти. Я бы рекомендовал вам посмотреть эти инструменты и запустить один за другим, чтобы узнать, что они вам предоставляют. Вы можете получить доступ к этим инструментам в xCode 4 в главном меню Product, а затем → Profile

Надеюсь, что это поможет

Ответ 3

В инструментах нажмите автоматическое включение моментальных снимков Измените режим просмотра на карту регионов. Найти в именах файлов файлов, которые используются при использовании приложения u в vmpages И после того, когда и очистите его. В примере с видео wwdc они использовали шифрование для файла, и это приводило его к vmpages, без слишком сложного кода, чтобы предложить что-то большее, чем [floo flush]: -)

Ответ 4

"Это в категории" Грязные "- 32 МБ резидентной грязной памяти..." "Я также заметил 32-мегабайтный кусок VM_ALLOCATE, и мне интересно..."

Я вижу то же самое "VM_ALLOCATE (8192 страницы) 32 МБ" для резидентных, грязных и виртуальных столбцов в VM Tracker, когда я просматриваю свои приложения в Simulator.

Для сравнения, я профилировал (более мелкие) демонстрационные приложения, созданные из Paul Hegarty, очень информативный курс iTunes U Stanford - например, психолог и графический калькулятор - и каждый раз вижу одну и ту же запись.

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

(FYI: Xcode 4.3 на MacBook Pro работает 10.7.3)