iOS-OOM

什么是OOM?
OOM一定会kill吗?
怎么监控识别OOM?
监控到了OOM怎么分析是谁造成的?

1、崩溃和OOM

APP的崩溃可以分为两类:信号可捕捉崩溃 和 信号不可捕捉崩溃。

1.1信号可捕捉的崩溃

数组越界:取数据时候索引越界,APP发生崩溃。给数组添加nil会崩溃。
多线程问题:多个线程进行数据的存取,可能会崩溃。例如有一个线程在置空数据的同时另一个线程在读取数据。
野指针问题:指针指向一个已删除的对象访问内存区域时,会出现野指针崩溃。野指针问题是导致 App 崩溃的最常见,也是最难定位的一种情况。
NSNotification线程问题:NSNotification 有很多种线程实现方式,同步、异步、聚合,所以不恰当的线程发送和接收会出现崩溃问题。
KVO问题:‘If your app targets iOS 9.0 and later or OS X v10.11 and later, you don't need to unregister an observer in its deallocation method。’ 在9.0之前需要手动remove 观察者,如果没有移除会出现观察者崩溃情况。

1.2信号不可捕捉的崩溃

后台任务超时
App超过系统限制的内存大小被杀死
主线程卡顿被杀死

总结:OOM是不可捕捉崩溃中的一种,是out-of-memory的缩写,是由于 iOS 的 Jetsam机制造成的一种“另类” Crash,它不同于常规的Crash,通过Signal捕获等Crash监控方案无法捕获到OOM事件。

2、怎么判定OOM

腾讯OOMDetector、微信matrix、字节

2.1采集日志

崩溃后可以在设置->隐私->分析与改进中找到JetsamEvent相关日志。
缺点:只能识别到发生过OOM,相关的类等具体原因无法进一步分析。

2.2排除法

Facebook和微信matrix采用此法。
缺点:排除法没有直接的监控来的那么精准,或多或少总有一些 bad case(WatchDog 崩溃、后台启动、应用 exit 主动退出、XCTest/UITest 等自动化测试框架驱动)

2.3线上 Memory Graph

字节自研的一款基于内存快照技术的线上方案,未开源。
火山引擎MARS-APM使用demo文档

参考:
iOS 崩溃常见类型 以及 日志收集处理
深入了解iOS中的OOM
火山引擎MARS-APM Plus x 飞书
iOS Out-Of-Memory 原理阐述及方案调研
iOS 性能优化实践:头条抖音如何实现 OOM 崩溃率下降50%+

你可能感兴趣的:(iOS-OOM)