You need to enable JavaScript to run this app.
文档中心
应用性能监控全链路版

应用性能监控全链路版

复制全文
下载 pdf
iOS 端监控
如何排查 OOM 问题
复制全文
下载 pdf
如何排查 OOM 问题
OOM 崩溃方案简介​
应用性能监控全链路版使用的是排除法方案来判定 OOM 崩溃的,之前的一篇技术文章详细介绍了判定的原理,可以参考 iOS性能优化实践:头条抖音如何实现OOM崩溃率下降50%+ 中的OOM 线上监控章节了解​
​
如何识别真正的 App OOM​
如上述 OOM 判定原理所述,当前的排除法方案虽然尽可能确保准确性,但依然还是会有误报的场景,可以根据如下数据判断一个 OOM 崩溃是不是误报:​
  1. 根据「系统内存压力状态」筛选,取值一般有四种:​
  • ​​​
  1. 16 表示 app 的内存占用已超过系统允许的最大内存 80%,这种情况基本可以确认是 app 内存占用过高导致的 OOM 问题,同时可以在内存趋势图中看到内存增长趋势,现场数据中也能看到 app 内存峰值​
  • ​​​​​
  1. 2、4 表示系统当前内存压力较大,这种情况下 app 主进程的内存占用可能并不高,而是系统其他例如 web 进程占用内存较高导致的,这些系统进程可能也和 app 相关。大部分情况下,这种内存压力值也伴随着 app 的高内存占用。​
  • ​​​
  1. 0 默认值,误报的可能性比较高,这种情况下一般 app 的内存占用不会特别高,但应用实际上确实是由于未知原因发生了闪退,可能的原因是:app 内存激增 SDK 未能记录到数据、系统整体内存占用较高、系统 fd/磁盘等资源不足强杀、误报等。这种数据不作为优先排查对象,一般用来观察不同版本的数据来确认内存优劣变化,并根据版本差异定位数据增长原因。​
  1. 当系统内存压力状态为 0 时,可以查看内存趋势图和现场数据中的 app 内存占用确认,如果内存占用确实不高,且数据上报趋势没有明显变化,则可以降低问题排查的优先级,优先查看系统内存压力状态为 2、4、16 的数据。​
  1. 除此之外,还可以结合业务数据来辅助问题确认,查看上报的用户是否进行了反馈、或者根据业务日志或者埋点查看是否是正常退出的场景被误报为了 OOM:​
  1. 正常退出场景我们都会进行排除,但是可能由于一些业务逻辑会影响到 OOM 的判定,例如部分业务可能 mock 或者拦截系统生命周期的通知回调等,导致 SDK 无法正确识别前后台状态或者 terminate 通知。​
  1. 部分业务自建的自动化测试流程 SDK 无法完全覆盖到,可能会被误报为 OOM,可以参考如何屏蔽自动化任务中产生的 OOM 问题处理​
  1. 其他场景可以在线下尝试复现一下,如果确认是由于某种场景导致的误报,可以提工单反馈 ​
​
OOM 问题如何排查​
OOM 崩溃上报的数据较少,分析问题需要结合其他信息或者通过抓取 MemoryGraph 来辅助排查,可以参考如下流程:​
  1. 查看内存趋势图和现场数据,尝试还原用户操作路径,确认 OOM 触发的场景或者页面。如下 case 可知用户是在切换了三个页面之后,最终在 APMInsightCrashViewController 触发了 OOM 崩溃。根据业务逻辑推测当前页面是否会产生较大的内存占用,优化大内存占用来降低 OOM 风险​
  • ​​​
  • ​​​
  1. 点击追查可以查看某个用户的事件流,分析用户发生 OOM 崩溃之前发生了哪些事件:加载了某个页面、发起了某个网络请求等​
  • ​​​​​
  1. 应用性能监控全链路版也提供了自定义事件和自定义日志,可以接入业务中,用来记录一些重要事件或者日志流,在发生问题时辅助问题排查:​
  • 自定义事件:接入 使用 支持聚合分析,一般用于分析群体数据或者单点问题排查,例如统计方法耗时、业务流程埋点等。​
  • 自定义日志:接入 使用 高性能流式日志,一般用于单点问题排查​
  1. 接入 MemoryGraph 后,当 app 内存占用到达一定阈值后,可以捕获当时的所有内存节点以及节点间的引用链路,通过分析这个数据来定位到是哪些内存对象分配过多、或者发生了泄露,详细使用说明可以参考 MemoryGraph 使用文档:​
  1. 单独分析 MemoryGraph 问题​
  • ​​​​​
  1. 分析和 OOM 崩溃关联的问题​
  • ​​​​​
​
​
最近更新时间:2025.11.12 11:24:54
这个页面对您有帮助吗?
有用
有用
无用
无用