SlideShare a Scribd company logo
1 of 42
Download to read offline
Life with out of
memory
Опыт LiveJournal
Денис Батвинкин
Rambler&Co
100% OOM-Free Сессии
2
Один из первых релизов
Title
April
OOM-FreeSession
40,00
55,00
70,00
85,00
100,00
iPhone5S iPhone7 iPhone 4S iPad2
51
79
94
87
3
4
Адресное пространство приложения
Kernal
space
Stack
space
User
space
6
Адресное пространство приложения
Kernal
space
Stack
space
User
space
(Virual memory)
Kernal
space
Stack
space
User
space
App
space
Virtual memory
7
Адресное пространство приложения
Kernal
space
Stack
space
User
space
Kernal
space
Stack
space
User
space
App
space
Kernal
space
Stack
space
User
space
Free App
space
Used
space App space
Virtual memory
8
Кейс Realm c mmap
9
Jettison - memory
hunter
11
18
100
Score
foreground
app
Score
suspended
app
12
xnu kernel событие
NOTE_VM_PRESSURE
13
didReceiveMemoryWarning
UIKit событие
xnu kernel событие
NOTE_VM_PRESSURE
14
No pressure, Mon!
http://newosxbook.com/articles/MemoryPressure.html
15
Инструменты для решения
проблемы
• Allocations, Leaks и Time Profiler
• applicationDidReceiveMemoryWarning и
didReceiveMemoryWarning
• Краш-репортеры Testflight, Crashlytics,
Hockeyapp
• JRFMemoryNoodler, TBOOMDetector
17
Инструменты для решения
проблемы
• Allocations, Leaks и Time Profiler
• applicationDidReceiveMemoryWarning и
didReceiveMemoryWarning
• Краш-репортеры Testflight, Crashlytics,
Hockeyapp
• JRFMemoryNoodler, TBOOMDetector
18
Инструменты для решения
проблемы
• Allocations, Leaks и Time Profiler
• applicationDidReceiveMemoryWarning и
didReceiveMemoryWarning
• Краш-репортеры Testflight, Crashlytics,
Hockeyapp
• JRFMemoryNoodler, TBOOMDetector
19
Логи Testflight
20
Лог OOM
21
Лог OOM
Crash
22
https://developer.apple.com/library/content/technotes/tn2151/_index.html#//
apple_ref/doc/uid/DTS40008184-CH1-
Understanding and Analyzing Application Crash Reports
23
Crash Reports сервисы
24
25
https://code.facebook.com/posts/1146930688654547/
reducing-fooms-in-the-facebook-ios-app/
Reducing FOOMs in the Facebook iOS app
26
Инструменты для решения
проблемы
• Allocations, Leaks и Time Profiler
• applicationDidReceiveMemoryWarning и
didReceiveMemoryWarning
• Краш-репортеры Testflight, Crashlytics,
Hockeyapp
• JRFMemoryNoodler, TBOOMDetector
19
TBOOMDetector JRFMemoryNoodler
Определяют OOM событие во время следующего
запуска
27
Проблемы которые мы
решили до первого релиза
• Блюр на экране поста
• Экраны при рекурсивном переходе по
навигейшен стеку
• Большие изображения в постах
• Получение больших объемов данных с сервера
29
Супер стабильное
приложение
VIPER
30
Супер стабильное приложение и
команда
31
Егор
Катя
Бэкенд
АПИ
Вадим
Настя
ТЗ
М
иш
а
Костя
Дима
Кто-то с чердака
LiveJournal
Title
April
OOM-FreeSession
40,00
55,00
70,00
85,00
100,00
iPhone5S iPhone7 iPhone 4S iPad2
80
92
9998
32
Слабые места:
GIF и UIWebView
33
Паттерн Producer/Consumer
producer Consumer
Image buffer
THREAD1 THREAD1 34
http://engineering.flipboard.com/2014/05/animated-gif
GIFS
35
Очистка кеша для результатов запроса
и картинок
36
Title
May
OOM-FreeSession
40,00
55,00
70,00
85,00
100,00
iPhone5S iPhone7 iPhone 4S iPad2
85
89
9898
37
Аналитика для Answers
38
Создание файл логгера
39
Лог процессора и памяти
40
В этот раз с памятью все ок
41
Причина всех бед - RESTKit
42
Выводы
• Используйте все доступные способы
обнаружения ошибок
• Не всегда решение бывает явное
• Проводите бета тестирование вашего
приложения
• Не используйте RESTKit в ваших приложениях
43
https://forums.developer.apple.com/thread/45177
Иногда наше приложение ниучем не уиновато
44
d.batvinkin@rambler-co.ru

More Related Content

More from RAMBLER&Co

RDSDataSource: Основы LLVM
RDSDataSource: Основы LLVMRDSDataSource: Основы LLVM
RDSDataSource: Основы LLVMRAMBLER&Co
 
Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!RAMBLER&Co
 
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?RAMBLER&Co
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRAMBLER&Co
 
RDSDataSource: OCLint
RDSDataSource: OCLintRDSDataSource: OCLint
RDSDataSource: OCLintRAMBLER&Co
 
RDSDataSource: Построение UML диаграмм
RDSDataSource: Построение UML диаграммRDSDataSource: Построение UML диаграмм
RDSDataSource: Построение UML диаграммRAMBLER&Co
 
RDSDataSource: App Thinning
RDSDataSource: App ThinningRDSDataSource: App Thinning
RDSDataSource: App ThinningRAMBLER&Co
 
RDSDataSource: Мастер-класс по Dip
RDSDataSource: Мастер-класс по DipRDSDataSource: Мастер-класс по Dip
RDSDataSource: Мастер-класс по DipRAMBLER&Co
 
RDSDataSource: YapDatabase
RDSDataSource: YapDatabaseRDSDataSource: YapDatabase
RDSDataSource: YapDatabaseRAMBLER&Co
 
Rambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тестыRambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тестыRAMBLER&Co
 
Rambler.iOS #8: Сервис-ориентированная архитектура
Rambler.iOS #8: Сервис-ориентированная архитектураRambler.iOS #8: Сервис-ориентированная архитектура
Rambler.iOS #8: Сервис-ориентированная архитектураRAMBLER&Co
 
Rambler.iOS #8: Make your app extensible with JavaScriptCore
Rambler.iOS #8: Make your app extensible with JavaScriptCoreRambler.iOS #8: Make your app extensible with JavaScriptCore
Rambler.iOS #8: Make your app extensible with JavaScriptCoreRAMBLER&Co
 
Rambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеровRambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеровRAMBLER&Co
 
RDSDataSource: iOS Reverse Engineering for inexperienced
RDSDataSource: iOS Reverse Engineering for inexperiencedRDSDataSource: iOS Reverse Engineering for inexperienced
RDSDataSource: iOS Reverse Engineering for inexperiencedRAMBLER&Co
 
RDSDataSource: Автогенерация документации для SDK
RDSDataSource: Автогенерация документации для SDKRDSDataSource: Автогенерация документации для SDK
RDSDataSource: Автогенерация документации для SDKRAMBLER&Co
 
RDSDataSource: Плюрализация в iOS
RDSDataSource: Плюрализация в iOSRDSDataSource: Плюрализация в iOS
RDSDataSource: Плюрализация в iOSRAMBLER&Co
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: PromisesRAMBLER&Co
 
RDSDataSource: Flux, Redux, ReSwift
RDSDataSource: Flux, Redux, ReSwiftRDSDataSource: Flux, Redux, ReSwift
RDSDataSource: Flux, Redux, ReSwiftRAMBLER&Co
 
Rambler.iOS #7: Построение сложного табличного интерфейса
Rambler.iOS #7: Построение сложного табличного интерфейсаRambler.iOS #7: Построение сложного табличного интерфейса
Rambler.iOS #7: Построение сложного табличного интерфейсаRAMBLER&Co
 
Rambler.iOS #7: Прием платежей по банковским картам в iOS приложении
Rambler.iOS #7: Прием платежей по банковским картам в iOS приложенииRambler.iOS #7: Прием платежей по банковским картам в iOS приложении
Rambler.iOS #7: Прием платежей по банковским картам в iOS приложенииRAMBLER&Co
 

More from RAMBLER&Co (20)

RDSDataSource: Основы LLVM
RDSDataSource: Основы LLVMRDSDataSource: Основы LLVM
RDSDataSource: Основы LLVM
 
Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!
 
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на Swift
 
RDSDataSource: OCLint
RDSDataSource: OCLintRDSDataSource: OCLint
RDSDataSource: OCLint
 
RDSDataSource: Построение UML диаграмм
RDSDataSource: Построение UML диаграммRDSDataSource: Построение UML диаграмм
RDSDataSource: Построение UML диаграмм
 
RDSDataSource: App Thinning
RDSDataSource: App ThinningRDSDataSource: App Thinning
RDSDataSource: App Thinning
 
RDSDataSource: Мастер-класс по Dip
RDSDataSource: Мастер-класс по DipRDSDataSource: Мастер-класс по Dip
RDSDataSource: Мастер-класс по Dip
 
RDSDataSource: YapDatabase
RDSDataSource: YapDatabaseRDSDataSource: YapDatabase
RDSDataSource: YapDatabase
 
Rambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тестыRambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тесты
 
Rambler.iOS #8: Сервис-ориентированная архитектура
Rambler.iOS #8: Сервис-ориентированная архитектураRambler.iOS #8: Сервис-ориентированная архитектура
Rambler.iOS #8: Сервис-ориентированная архитектура
 
Rambler.iOS #8: Make your app extensible with JavaScriptCore
Rambler.iOS #8: Make your app extensible with JavaScriptCoreRambler.iOS #8: Make your app extensible with JavaScriptCore
Rambler.iOS #8: Make your app extensible with JavaScriptCore
 
Rambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеровRambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеров
 
RDSDataSource: iOS Reverse Engineering for inexperienced
RDSDataSource: iOS Reverse Engineering for inexperiencedRDSDataSource: iOS Reverse Engineering for inexperienced
RDSDataSource: iOS Reverse Engineering for inexperienced
 
RDSDataSource: Автогенерация документации для SDK
RDSDataSource: Автогенерация документации для SDKRDSDataSource: Автогенерация документации для SDK
RDSDataSource: Автогенерация документации для SDK
 
RDSDataSource: Плюрализация в iOS
RDSDataSource: Плюрализация в iOSRDSDataSource: Плюрализация в iOS
RDSDataSource: Плюрализация в iOS
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
 
RDSDataSource: Flux, Redux, ReSwift
RDSDataSource: Flux, Redux, ReSwiftRDSDataSource: Flux, Redux, ReSwift
RDSDataSource: Flux, Redux, ReSwift
 
Rambler.iOS #7: Построение сложного табличного интерфейса
Rambler.iOS #7: Построение сложного табличного интерфейсаRambler.iOS #7: Построение сложного табличного интерфейса
Rambler.iOS #7: Построение сложного табличного интерфейса
 
Rambler.iOS #7: Прием платежей по банковским картам в iOS приложении
Rambler.iOS #7: Прием платежей по банковским картам в iOS приложенииRambler.iOS #7: Прием платежей по банковским картам в iOS приложении
Rambler.iOS #7: Прием платежей по банковским картам в iOS приложении
 

Rambler.iOS #9: Life with out of memory