iOS 开发高手课
戴铭
前滴滴出行技术专家
42934 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
用户故事 (1讲)
iOS 开发高手课
15
15
1.0x
00:00/00:00
登录|注册

14 | 临近 OOM,如何获取详细内存分配信息,分析内存问题?

malloc_logger函数
malloc和calloc函数
didReceiveMemoryWarning代理事件
memorystatus_priority_entry结构体
per-process-limit
rpages
实现记录内存分配的小工具
macOS系统
iOS系统
优先级判断
vm_pressure_monitor线程
未授权访问内存
访问未提交的内存
访问未分配的内存
记录内存分配量及分配者
dump完整内存信息
内存警告
XNU
JetsamEvent日志
监控内存资源过度使用
资源管控机制
被系统强杀
iOS系统对单个App占用内存上限
课后小作业
MemoryStatus机制
iOS系统内存压力监控
内存问题类型
定位内存问题信息收集
获取内存上限值
Jetsam机制
OOM (Out of Memory)现象
临近 OOM,如何获取详细内存分配信息,分析内存问题

该思维导图由 AI 生成,仅供参考

你好,我是戴铭。今天我们来聊聊,临近 OOM,如何获取详细的内存分配信息,分析内存问题的话题。
OOM,是 Out of Memory 的缩写,指的是 App 占用的内存达到了 iOS 系统对单个 App 占用内存上限后,而被系统强杀掉的现象。这么说的话,OOM 其实也属于我们在第 12 篇文章“iOS 崩溃千奇百怪,如何全面监控?”中提到的应用“崩溃”中的一种,是由 iOS 的 Jetsam 机制导致的一种“另类”崩溃,并且日志无法通过信号捕捉到。
JetSam 机制,指的就是操作系统为了控制内存资源过度使用而采用的一种资源管控机制。
我们都知道,物理内存和 CPU 对于手机这样的便携设备来说,可谓稀缺资源。所以说,在 iOS 系统的虚拟内存管理中,内存压力的管控就是一项很重要的内容。
接下来,我就跟你介绍一下如何获取内存上限值,以及如何监控到 App 因为占用内存过大而被强杀的问题?

通过 JetsamEvent 日志计算内存限制值

想要了解不同机器在不同系统版本的情况下,对 App 的内存限制是怎样的,有一种方法就是查看手机中以 JetsamEvent 开头的系统日志(我们可以从设置 -> 隐私 -> 分析中看到这些日志)。
在这些系统日志中,查找崩溃原因时我们需要关注 per-process-limit 部分的 rpages。rpages 表示的是 ,App 占用的内存页数量;per-process-limit 表示的是,App 占用的内存超过了系统对单个 App 的内存限制。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了在临近OOM时如何获取详细的内存分配信息以及分析内存问题的方法。作者首先介绍了获取系统对单个App设置的内存限制值的方法,包括查看系统日志中的JetsamEvent、通过XNU获取内存上限值以及利用didReceiveMemoryWarning代理事件动态获取内存限制值。此外,作者还强调了定位内存问题信息收集的重要性,包括dump出完整的内存信息、获取每个对象的内存占用量以及监控内存分配情况。最后,作者介绍了如何通过Hook函数来记录内存分配情况,以便跟踪导致内存不合理增大的原因。整体而言,本文提供了丰富的方法和工具来解决内存问题,为开发者提供了深入的内存管理和分析的技术细节。文章还探讨了iOS和macOS系统中的MemoryStatus机制以及不同类型的内存问题,为读者提供了全面的内存管理和分析知识。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《iOS 开发高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(26)

  • 最新
  • 精选
  • 鼠辈
    info.resident_size这个获取的内存和xcode上显示的内存是对不上的。不知道您怎么看这个问题?

    作者回复: 使用的字段不同,task_vm_info_data_t 还有个 phys_footprint 代表的实际使用的物理内存

    2019-04-11
    2
    3
  • drunkenMouse
    线程使用优先级时,CPU 占用多的线程的优先级会被降低。这句话怎么读不懂呢? 利用didReceivedMemoryWarning 这个代理时间,看得我一愣。。应该是代理事件,我这算不算鸡蛋里面挑骨头? task_infk的使用需要导入<mach/mach.h> 最后一段意思是,系统通过malloc_logger来统计并管理内存的分配情况?

    作者回复: 在你设置相同优先级的线程中,系统会有更细的优先级策略,这个策略就是哪个线程 CPU 占用高,优先级会比降低

    2019-04-12
    2
  • 无名
    当系统还剩多少内存时,会发出内存不足的通知。

    作者回复: 本文都是围绕这个问题在说呢。会根据系统和硬件不同而定

    2019-06-25
  • drunkenMouse
    系统在强杀App前,会先做优先级判断。意思是:如果优先级高的话,本来会强杀的也不强杀了,而去强杀那些没有达到limit的进程?

    作者回复: 强杀前系统会根据文后的策略判断应该优先强杀谁

    2019-04-13
  • drunkenMouse
    didReceivedMemory 动态获取内存值的方法,没有找到啊 大佬能说一下吗?

    作者回复: 是在 didReceiveMemoryWarning 回调里去获取当前 App内存使用值

    2019-04-13
  • mαnajay
    hook malloc_logger aop收集日志,然后在OOM那6秒内收集所有内存分配信息,然后在再次启动应用时 上报这两部分日志吗? oom那一刻是指的哪个时机,接受内存警告? didReceiveMemoryWarning 中判断 是否靠近 limit吗

    作者回复: OOM 是内存超标被系统强杀时

    2019-04-11
  • 欢乐的小马驹
    我建议,以后写这样的专栏,最后把所有参考的原始资料都下。你觉得呢?
    2020-05-21
    16
  • 白开了杯水
    一直不知道内存分配最大值获取和怎么获取当前内存分配,看了文章豁然开朗,想问的是,老师这些知识都是通过分析源码得来的吗?
    2019-04-11
    1
    16
  • drunkenMouse
    iOS通过堆栈管理所有的app进程,通过一个优先级最高的线程去监控系统内存的压力,还有一个快速对照表记录所有app的内存使用情况。如果内存有压力了,就按照优先级去释放优先级低还使用内存多的。 所以app得内存阈值是没有固定大小的。我一直以为每个app可以使用的内存大小是固定的。。
    2019-04-14
    10
  • D
    腾讯的OOMDetector就是干这个事的https://github.com/Tencent/OOMDetector
    2021-08-16
    5
收起评论
显示
设置
留言
26
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部