Определение местоположения проблем памяти в приложении

Управление памятью, которую использует Ваше приложение, является одним из самых важных аспектов создания приложения. С самого маленького устройства на iOS на самый большой компьютер OS X память является конечным ресурсом. Для многих разработчиков большая часть сокращения емкости памяти они достигают в их приложениях, и процессы прибывает из использования инструмента Выделений для наблюдения, где большая часть памяти выделяется и выясняющей способы сократить тот размер, возможно путем изменения их структур данных и/или алгоритмов. Но даже лучшие проекты приложения могут быть заполонены проблемами памяти, которые трудно изолировать. В этой главе описываются, как идентифицировать несколько проблем общей памяти, из памяти утечки зомби.

Исследование использования памяти с шаблоном трассировки монитора действия

Шаблон трассировки Монитора Действия контролирует полное системное действие и статистику, включая CPU, память, диск и сеть. Это состоит из инструмента Монитора Действия только, несмотря на то, что можно добавить дополнительные инструменты к документу трассировки, Вы создали с шаблоном, если Вы желаете. Вы будете видеть позже, что Монитор Действия также используется для контроля сетевой активности на устройствах на iOS.

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

Рисунок 7-1 показывает лучшим пяти пользователям памяти в системе.

  Инструмент Монитора Действия рисунка 7-1 с диаграммами

Область Record Settings на боковой панели инспектора включает список системной статистики, которая может быть сконфигурирована для появления в дорожке, разделяют на области и графически представляют собранные данные. Установите флажок статистической величины, чтобы видеть, что он изобразил в виде графика в области дорожки. Щелкните по форме или цвету хорошо, чтобы измениться, как статистическая величина появляется в области дорожки.

../Art/instruments_activity_monitor_statistics_2x.png

Существует много статистических данных инструментальные поддержки Монитора Действия, но следующие специфичны для памяти:

Если одни из статистических данных выше не появляются под Системной Статистикой, определяют местоположение ее под “Избранной статистикой, чтобы перечислить” и щелкнуть по ее флажку для включения ее в список.

Нахождение заброшенной памяти с шаблоном трассировки выделений

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

Поскольку заброшенная память все еще технически допустима, просто не полезна, инструмент Утечек не имеет никакого способа идентифицировать ее. Поэтому необходимо выполнить некоторое расследование для определения местоположения проблемы. Шаблон трассировки Выделений помогает с этим процессом путем измерения использования памяти «кучи» и отслеживания выделений, включая выделения конкретного объекта классом. Это также записывает статистику виртуальной памяти областью. Это включает и Выделения и инструменты Средства отслеживания VM. В целях определения местоположения заброшенной памяти Вы будете использовать строго инструмент Выделений.

Используйте шаблон Allocations, чтобы гарантировать, что «куча» не продолжает расти, неоднократно выполняя тот же набор операций. Например, окончание и запуск новой игры, открытие и закрытие окна, или установка и сбрасывание предпочтения являются всеми операциями, которые должны концептуально возвратить Ваше приложение предыдущему и стабильному состоянию памяти. Циклическое повторение через такие операции много раз не должно приводить к неограниченному росту «кучи». Этот процесс повторения и анализа известен как анализ поколений. «Генерация» представляет ряд выделений, произошедших за установленный период времени. Путем повторения действий по многократным поколениям можно проанализировать результаты для идентификации трендов выделения. При нахождении discrepencies в этих трендах можно заняться расследованиями далее, чтобы определить, отказываются ли от памяти, и если так, где. Затем можно фиксировать его.

bullet
Счесть память отказавшейся Вашим приложением
  1. Откройте шаблон трассировки Выделений.

    ../Art/instruments_finding_abandoned_memory_allocations_trace_template_2x.png
  2. Выберите свое приложение из Выбрать всплывающего меню Target на панели инструментов.

    ../Art/instruments_finding_abandoned_memory_choose_target_2x.png
  3. Нажмите Display Settings на боковой панели инспектора.

    ../Art/instruments_finding_abandoned_memory_display_settings_inspector_2x.png

    Это предоставляет Вам быстрый доступ к кнопке Mark Generation, которую Вы будете использовать для установки флага различных поколений действий, поскольку Вы профилируете свое приложение.

  4. Нажмите Кнопку записи на панели инструментов, чтобы начать профилировать Ваше приложение.

    ../Art/instruments_finding_abandoned_memory_record_button_2x.png
  5. Выполните короткую последовательность повторимых действий в Вашем приложении.

    Для точной генерации трендов это должно быть рядом действий, который запускается и заканчивается в том же состоянии.

  6. После каждой итерации повторимых действий нажмите кнопку Mark Generation на боковой панели инспектора.

    ../Art/instruments_finding_abandoned_memory_generation_2x.png

    Флаг, кажется, в области дорожки идентифицирует генерацию.

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

  7. Повторяйте шаги 5 и 6 несколько раз, пока Вы не видите, растет ли «куча» без предела; тогда щелкните по Кнопке остановки.

    ../Art/instruments_finding_abandoned_memory_stop_button_2x.png
  8. В подробной области щелкните по треугольнику раскрытия налево от генерации для отображения объектов, которые это содержит.

    ../Art/instruments_finding_abandoned_memory_generation_disclosure_2x.png
  9. Ищите объекты, которые может выделять Ваше приложение, которые сохраняются. Если Вы идентифицируете один, щелкните по треугольнику раскрытия налево от него для отображения его экземпляров.

  10. Выберите экземпляр и нажмите Extended Detail на боковой панели инспектора для просмотра отслеживания стека для того выделения.

    ../Art/instruments_finding_abandoned_memory_persistent_instance_2x.png../Art/instruments_finding_abandoned_memory_persistent_instance_2x.png

    В отслеживании стека Ваш код является легко идентифицируемым, потому что это окрасило черным и предшествовавшим пользовательским значком. Для создания кода еще проще найти щелкните по кнопке свертывания для сокрытия системных вызовов в отслеживании стека.

  11. Дважды щелкните по записи отслеживания стека для отображения ее соответствующего кода в подробной области.

    ../Art/instruments_finding_abandoned_memory_stack_trace_code_2x.png

    Если Вы предпочитаете, можно щелкнуть по значку Xcode в подробной панели навигации области для отображения кода в XCode.

    ../Art/instruments_finding_abandoned_memory_stack_trace_xcode_button_2x.png
  12. Оцените свой код, чтобы определить, полезно ли выделение или нет. Если это не, то это отказалось от памяти, и необходимо разрешить его.

Нахождение Утечек в Приложении с шаблоном Leaks

Шаблон трассировки Утечек измеряет общее использование памяти, проверки на пропущенную память, и обеспечивает статистику по объектным выделениям историями класса, а также адреса памяти для всех активных выделений и пропустил блоки. Это состоит из инструментов Утечек и Выделений.

Используйте инструмент Утечек для нахождения объектов в приложении, на которые больше не ссылаются и не достижимы. Инструмент Утечек сообщает об этих блоках памяти. Большинство этих утечек является объектами и сообщается с именем класса. О других сообщают как Malloc-размер.

bullet
Определять местоположение протекающей памяти
  1. Откройте шаблон Leaks.

  2. От Выбрать всплывающего меню Target на панели инструментов выберите свое приложение.

  3. Нажмите Кнопку записи.

  4. Осуществите свое приложение, чтобы выполнить код и нажать Stop, когда утечки выведены на экран.

  5. Щелкните по любому пропущенному объекту, идентифицирующемуся в области Detail.

  6. В Расширенном Подробном инспекторе дважды щелкните по инструкции от своего кода.

  7. Щелкните по значку Xcode в области Detail для открытия того кода в XCode.

    ../Art/Leaks_found_V6_2x.png

Если пропущенная память будет объектом Objective C, то нажатие стрелки фокуса рядом с адресом отдельного объекта покажет сохранение/историю версий объекта с соответствующими отслеживаниями стека для каждого события.

Необъектные утечки являются результатом вызова malloc() без соответствия free() и таким образом только отслеживание стека события выделения представлено.

Представление Leaks by Backtrace агрегировало все пропущенные блоки их точкой выделения — единственная ошибка в исходном коде может привести к многократным утечкам во время выполнения, поскольку код неоднократно выполняется.

После открытия Xcode для наблюдения части кода, создающего утечку причина утечки может все еще быть неясной. Инструмент Утечек позволяет Вам видеть цикл, создающий утечку в опции Cycles & Roots в подробной области. Представление Cycles & Roots важно при записи использованию приложений Automatic Reference Counting (ARC), поскольку это высказывает мнение уровня графика пропущенных объектов, помогающий в диагнозе сохраняют циклы. Часто решение этих проблем будет отмечать ссылочное в графе объектов с weak ключевое слово.

bullet
Видеть график цикла утечки
  1. Выберите инструмент Утечек.

  2. Выберите Cycles и Roots в подробной области.

  3. Выберите утечку, график которой Вы хотите видеть.

    ../Art/Leaks_cycle_graph_V6_2x.png../Art/Leaks_cycle_graph_V6_2x.png

Инструмент Выделений также показывает области VM типом, включая области CALayer, идентифицированные их классами объектов делегата. Это позволяет Вам видеть следы выделения для тех областей, в отличие от этого в инструменте Средства отслеживания VM. Это может быть полезно для оптимизации пространства в графически-тяжелых приложениях с тех пор часто, объекты ObjC ссылаются на индивидуальное изображение области VM.

../Art/Locating_Memory_Issues_Allocations_VM_V6_2x.png../Art/Locating_Memory_Issues_Allocations_VM_V6_2x.png

Уничтожение зомби с шаблоном трассировки зомби

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

Зомби прослеживают шаблонные наборы переменная окружения NSZombieEnabled к true который направляет компилятор для замены объектом типа NSZombie для объектов, выпущенных к подсчету ссылок нуля. Затем когда зомби передается, сбои приложения, записывая остановки и Зомби, Переданное диалоговое окно появляется. При щелчке по кнопке фокусировки направо от сообщения в Зомби Обнаруженное диалоговое окно выводит на экран полную историю памяти сверхвыпущенного объекта. Это позволяет Вам исследовать сохранение и историю версий проблематичного объекта зомби, пытаться определить, был ли дополнительный выпуск (или автовыпуск), который не должен был быть там, или возможно отсутствие сохраняет. Обратите внимание на то, что эта история памяти является единственной частью Инструмента Выделений, который значим при использовании шаблона трассировки Зомби.

bullet
Найти зомби в Вашем коде
  1. Откройте шаблон Zombies.

  2. Выберите свое приложение из Выбрать всплывающего меню Target.

  3. Нажмите Кнопку записи и осуществите свое приложение.

  4. Когда Зомби щелкают по кнопке фокусировки направо от текста сообщения в диалоговом окне, Переданное диалоговое окно появляется.

  5. Откройте Расширенного Подробного инспектора в области боковой панели и дважды щелкните по записи Зомби в конечном счете столбец Type объектной таблицы истории.

  6. Дважды щелкните по ответственной вызывающей стороне в разделе Stack Trace Расширенного Подробного инспектора для отображения ответственного кода.

    ../Art/Finding_Messages_Sent_to_Deallocated_Step5_2x.png../Art/Finding_Messages_Sent_to_Deallocated_Step5_2x.png

Когда NSZombie объект передается, Зомби, Переданное диалоговое окно появляется. При щелчке по кнопке фокусировки направо от сообщения в Зомби Переданное диалоговое окно выводит на экран полную историю памяти сверхвыпущенного объекта.

Обратите внимание на то, что у Зомби Переданное диалоговое окно есть точка наверху, выровненный с фиолетовым треугольником во временной шкале. Если Зомби, Переданное диалоговое окно больше не видимо и Вы хотите видеть его снова, щелкните по фиолетовому треугольнику.