Пошаговое руководство. Использование средства Apple Instruments
В этой статье последовательно описываются этапы использования средства Apple Instruments для диагностики проблем с памятью в приложении iOS, созданном с помощью Xamarin. В ней описывается запуск Instruments, создание мгновенного снимка кучи и анализ роста памяти. В статье также показано, как использовать Instruments для отображения и определения именно тех строк кода, которые приводят к возникновению проблем с памятью.
На этой странице рассказывается, как использовать средство Xcode Instruments для диагностики проблем с памятью в приложении iOS.
Диагностика проблем с памятью
В Visual Studio для Mac запустите инструмент из пункта меню "Инструменты > запуска инструментов".
Отправьте приложение на устройство, выбрав пункт меню "Выполнить > отправку на устройство ".
Выберите шаблон Allocations (Распределения). Это оранжевый значок с белым полем
Выберите приложение Memory Demo в списке Choose a profiling template for (Выберите шаблон профилирования для) в верхней части окна. Сначала щелкните устройство iOS, чтобы развернуть меню со списком установленных приложений.
Нажмите кнопку Choose (Выбрать) в нижнем правом углу окна, чтобы запустить Instruments. Этот шаблон отобразит в верхней области два элемента: Allocations и VM Tracker (Трекер ВМ).
Нажмите кнопку Record (Запись), т. е. красный кружок в верхнем левом углу экрана Instruments, чтобы запустить приложение.
Выберите строку VM Tracker в верхней области. Теперь, когда приложение запущено, она будет содержать два раздела: Dirty (Черновик) и Resident Size (Размер в памяти). В области Inspector (Инспектор) выберите Show Display Settings (Показать параметры отображения), т. е. значок шестеренки, а затем установите флажок Automatic Snapshotting (Автоматическое создание снимков), показанный на следующем снимке экрана в правом нижнем углу:
Выберите строку Allocations в верхней области. Теперь, когда приложение запущено, в ней будет написано All Heap and Anonymous VM (Вся куча и анонимные ВМ)
В области Inspector выберите параметр Show Display Settings (значок шестеренки), а затем нажмите кнопку Mark Generation (Отметить поколение), чтобы задать набор базовых показателей. На временной шкале в верхней части окна появится небольшой красный флажок
Прокрутите приложение, а затем нажмите Mark Generation. Повторите это действие несколько раз
Нажмите кнопку Stop (Остановить).
Разверните узел Generation (Поколение) с наибольшим значением Growth (Рост) и задайте сортировку по показателю Growth по убыванию.
В области Inspector выберите Show Extended Detail (Показать расширенные сведения), т. е. элемент "E", чтобы отобразить трассировку стека.
Обратите внимание, что узел, отличный от объекта>, показывает чрезмерный <рост памяти. Щелкните стрелку рядом с этим узлом, чтобы увидеть дополнительные сведения. Щелкните правой кнопкой мыши по трассировке стека, чтобы добавить в область Source Location (Исходное расположение):
Выполните сортировку по показателю Size (Размер) и откройте представление Expanded Detail (Расширенные сведения):
Щелкните нужную запись в стеке вызовов, чтобы просмотреть соответствующий код:
В нашем случае для каждой ячейки создается новый образ, который помещается в коллекцию. Существующие ячейки коллекции повторно не используются.
Устранение проблем с памятью
Средство 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, загружать шаблон распределения памяти и пошагово использовать моментальные снимки для выявления проблем с памятью. Наконец, статья рассматривает повторную проверку приложения для подтверждения, что проблемы устранены.