Бөлісу құралы:


Пошаговое руководство. Использование средства Apple Instruments

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

На этой странице рассказывается, как использовать средство Xcode Instruments для диагностики проблем с памятью в приложении iOS.

Диагностика проблем с памятью

  1. В Visual Studio для Mac запустите инструмент из пункта меню "Инструменты > запуска инструментов".

  2. Отправьте приложение на устройство, выбрав пункт меню "Выполнить > отправку на устройство ".

  3. Выберите шаблон Allocations (Распределения). Это оранжевый значок с белым полем

    Выбор шаблона Allocations (Распределения)

  4. Выберите приложение Memory Demo в списке Choose a profiling template for (Выберите шаблон профилирования для) в верхней части окна. Сначала щелкните устройство iOS, чтобы развернуть меню со списком установленных приложений.

    Выбор приложения Memory Demo

  5. Нажмите кнопку Choose (Выбрать) в нижнем правом углу окна, чтобы запустить Instruments. Этот шаблон отобразит в верхней области два элемента: Allocations и VM Tracker (Трекер ВМ).

  6. Нажмите кнопку Record (Запись), т. е. красный кружок в верхнем левом углу экрана Instruments, чтобы запустить приложение.

  7. Выберите строку VM Tracker в верхней области. Теперь, когда приложение запущено, она будет содержать два раздела: Dirty (Черновик) и Resident Size (Размер в памяти). В области Inspector (Инспектор) выберите Show Display Settings (Показать параметры отображения), т. е. значок шестеренки, а затем установите флажок Automatic Snapshotting (Автоматическое создание снимков), показанный на следующем снимке экрана в правом нижнем углу:

    Выбор пункта Show Display Settings (Показать параметры отображения) (значок шестеренки) и установка флажка Automatic Snapshotting (Автоматическое создание снимков)

  8. Выберите строку Allocations в верхней области. Теперь, когда приложение запущено, в ней будет написано All Heap and Anonymous VM (Вся куча и анонимные ВМ)

  9. В области Inspector выберите параметр Show Display Settings (значок шестеренки), а затем нажмите кнопку Mark Generation (Отметить поколение), чтобы задать набор базовых показателей. На временной шкале в верхней части окна появится небольшой красный флажок

  10. Прокрутите приложение, а затем нажмите Mark Generation. Повторите это действие несколько раз

  11. Нажмите кнопку Stop (Остановить).

  12. Разверните узел Generation (Поколение) с наибольшим значением Growth (Рост) и задайте сортировку по показателю Growth по убыванию.

  13. В области Inspector выберите Show Extended Detail (Показать расширенные сведения), т. е. элемент "E", чтобы отобразить трассировку стека.

  14. Обратите внимание, что узел, отличный от объекта>, показывает чрезмерный <рост памяти. Щелкните стрелку рядом с этим узлом, чтобы увидеть дополнительные сведения. Щелкните правой кнопкой мыши по трассировке стека, чтобы добавить в область Source Location (Исходное расположение):

    Добавление исходного расположения в область

  15. Выполните сортировку по показателю Size (Размер) и откройте представление Expanded Detail (Расширенные сведения):

    Сортировка по размеру и отображение представления Expanded Detail (Расширенные сведения)

  16. Щелкните нужную запись в стеке вызовов, чтобы просмотреть соответствующий код:

    Просмотр кода

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

Устранение проблем с памятью

Средство Instruments позволяет устранить эти проблемы и перезапустить приложение.

Объявив только один экземпляр на уровне класса, вы сможете повторно использовать образ и объект ячейки из существующего пула, а не создавать их каждый раз заново:

public override UICollectionViewCell GetCell (UICollectionView collectionView, NSIndexPath indexPath)
{
    // Dequeue a cell from the reuse pool
    var imageCell = (ImageCell)collectionView.DequeueReusableCell (cellId, indexPath);

    // Reuse the image declared at the class level
    imageCell.ImageView.Image = image;

    return imageCell;
}

Теперь при запуске приложения использование памяти значительно сокращается — значение показателя Growth между поколениями теперь измеряется в KiB (килобайтах), а не в MiB (мегабайтах), как было до исправления кода:

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

В статье сборка мусора Xamarin.iOS является полезной ссылкой для решения проблем с памятью с Xamarin.iOS.

Итоги

Эта статья показывает, как использовать Instruments для диагностики проблем с памятью. Она описывает, как запускать Instruments в среде Visual Studio для Mac, загружать шаблон распределения памяти и пошагово использовать моментальные снимки для выявления проблем с памятью. Наконец, статья рассматривает повторную проверку приложения для подтверждения, что проблемы устранены.