вторник, 21 февраля 2012 г.

Memory-leak в iOS и Android

Android

NOTE1: лики лучше искать на эмуляторе. На Android в эмуляторе можно находить лики даже в приложениях, сорцов которых у вас нет. (На девайсе в большинстве случаев надо править некоторые конфигурационные файлы, а для этого надо обладать root-правами ). Но придется смириться с некоторыми тормозами в чистке heap и добытии *.hprof файлов с эмулятора (иногда до 3-4 минут)
  1. Качаем и ставим Eclipse memory analyzer
  2. Запускаем Eclipse и подключаем эмулятор или девайс
  3. DDMS>Devices>Update heap
  4. В DDMS выбираем вкладку Heap 
  5. Интенсивно используем проверяемое приложение
  6. Наблюдаем за потребление памяти
  7. Кликаем Cause GC, если потребление не уменьшилось через 30 секунд то
  8. Кликаем Dump HPROF file и сохраняем файл
  9. Конвертируем hprof-conv исходный_файл конечный_файл
  10. Запускаем Memory Ananlyzer>Open Heap Dump
  11. Выбираем Leak Suspects Report
  12. Анализируем подозреваемых
  13. Переключаемся на вкладку Overview>клик на Dominator Tree
  14. Анализируем что течет
  15. Закрываем приложение – наблюдаем сгенерированные файлы отчётов в папке, куда был скопирован *.hprof файл
Также можно мониторить потребление памяти при включенном параметре "Don't keep activities" (OS 4 и выше) в Settings>Developer options. Все активити, на которых нет ссылок должны очищаться garbage collector. 

Помимо утечек памяти может меть место неправильное управление памятью. В представленом ниже видео так и случается. 
  1. При каждой смене ориентации девайса выделяется память
  2. После того как мы принудительно почистим память - использованное количество памяти уменьшается, но общее выделенное количество не уменьшается
В итоге рано или поздно память закончится (heap size) и приложение завалится.
Естественно, пример утрирован, но небольшие утечки памяти при смене ориентации девайса случаются достаточно часто.




iOS

NOTE2: Лики лучше искать на реальном девайсе, все-таки симулятор – не эталон 

  1. Запускаем xCode и выбираем интересующий нас проект
  2. Product>Profile
  3. Instruments>Leaks
  4. Интенсивно нагружаем приложение
  5. Следим за выделением памяти на графике Allocations
  6. Как только memory leak появляется на графике Leaks, кликаем на него и наблюдаем где он появился 
Кликать точно на красный бар не надо. В статистике снизу показывается общий размер ликов и место, где они произошли.


PS спасибо Евгению Назаруку и Алексею Калиниченко за тестовые приложения!

PPS обнаружил хорошее выступление по утечкам памяти в iOS