作者:杨津,腾讯移动客户端开辟高级工程师
贸易转载请接洽腾讯WeTest得到授权,非贸易转载请注明出处。
原文链接:https://wetest.qq.com/lab/view/367.html
WeTest导读
如今iOS主流的内存监控工具是Instruments的Allocations,但只能用于开辟阶段。本文先容怎样实现离线化的内存监控工具,用于App上线后发现内存题目。
FOOM(ForegroundOutOfMemory),是指App在前台因斲丧内存过多引起体系强杀。对用户而言,表现跟crash一样。Facebook早在2015年8月提出FOOM检测办法,大抵原理是打扫各种环境后,剩余的环境是FOOM,具体链接:https://code.facebook.com/posts/1146930688654547/reducing-fooms-in-the-facebook-ios-app/。
微信自15年年底上线FOOM上报,从最初数据来看,每天FOOM次数与登任命户数比例靠近3%,同期crash率1%不到。而16年年初某东老大反馈微信频仍闪退,在艰巨拉取2G多日记后,才发现kv上报频仍打log引起FOOM。接着16年8月不少外部用户反馈微信启动不久后闪退,分析大量日记还是不能找到FOOM缘故起因。微信急需一个有效的内存监控工具来发现题目。
一、实现原理
微信内存监控最初版本是利用Facebook的FBAllocationTracker工具监控OC对象分配,用fishhook工具hookmalloc/free等接口监控堆内存分配,每隔1秒,把当前全部OC对象个数、TOP200最大堆内存及其分配堆栈,用文本log输出到本地。该方案实现简单,一天内完成,通过给用户下发TestFlight,终极发现接洽人模块因迁徙DB加载大量接洽人导致FOOM。
不外这方案有不少缺点:
1、监控粒度不敷细,像大量分配小内存引起的质变无法监控,别的fishhook只能hook自身app的C接口调用,对体系库不起作用;
2、打log隔断不好控制,隔断过长大概丢失中心峰值环境,隔断过短会引起耗电、io频仍等性能题目;
3、上报的原始log靠人工分析,缺少好的页面工具显现和归类题目。
以是二期版本以Instruments的Allocations为参考,偏重四个方面优化,分别是数据网络、存储、上报及显现。
1.数据网络
16年9月尾为了办理ios10nanocrash,研究了libmalloc源码,偶然中发现这几个接口:
当malloc_logger和__syscall_logger函数指针不为空时,malloc/free、vm_allocate/vm_deallocate等内存分配/开释通过这两个指针关照上层,这也是内存调试工具mallocstack的实现原理。有了这两个函数指针,我们很轻易记录当前存活对象的内存分配信息(包罗分配巨细和分配堆栈)。分配堆栈可以用backtrace函数捕获,但捕获到的地点是假造内存地点,不能从符号表dsym分析符号。以是还要记录每个image加载时的偏移slide,如许符号表地点=堆栈地点-slide。
别的为了更好的归类数据,每个内存对象应该有它所属的分类Category,如上图所示。对于堆内存对象,它的Category名是“Malloc”+分配巨细,如“Malloc48.00KiB”;对于假造内存对象,调用vm_allocate创建时,末了的参数flags代表它是哪类假造内存,而这个flags正对应于上述函数指针__syscall_logger的第一个参数type,每个flag具体寄义可以在头文件
二、低落误判
先回顾Facebook怎样判定上一次启动是否出现FOOM:
1.App没有升级
2.App没有调用exit()或abort()退出
3.App没有出现crash
4.用户没有强退App
5.体系没有升级/重启
6.App当时没有背景运行
7.App出现FOOM
1、2、4、5比力轻易判定,3依靠于自身CrashReport组件的crash回调,6、7依靠于ApplicationState和前背景切换关照。微信自上线FOOM数据上报以来,出现不少误判,重要环境有:
ApplicationState禁绝
部分体系会在背景短暂唤起app,ApplicationState是Active,但又不是BackgroundFetch;实行完didFinishLaunchingWithOptions就退出了,也有收到BecomeActive关照,但很快也退出;整个启动过程连续5~8秒不等。办理方法是收到BecomeActive关照一秒后,才以为这次启动是正常的前台启动。这方法只能镌汰误判概率,并不能彻底办理。
群控类外挂
这类外挂是可以长途控制iPhone的软件,通常一台电脑可以控制多台手机,电脑画面和手机屏幕及时同步操纵,如开启微信,主动加好友,发朋侪圈,逼迫退出微信,这一过程轻易产生误判。办理方法只能通过安全背景打击才华镌汰这类误判。
CrashReport组件出现crash没有回调上层
微信曾经在17年5月尾发作大量GIFcrash,该crash由内存越界引起,但收到crash信号写crashlog时,由于内存池破坏,组件无法正常写crashlog,乃至引起二次crash;上层也无法收到crash关照,因此误判为FOOM。如今改成不依靠crash回调,只要本地存在上一次crashlog(不管是否完备),就以为是crash引起的APP重启。
前台卡死引起体系watchdog强杀
也就是常见的0x8badf00d,通常缘故起因是前台线程过多,死锁,或CPU利用率连续过高等,这类强杀无法被App捕获。为此我们连合了已有卡顿体系,当前台运行末了一刻有捕获到卡顿,我们以为这次启动是被watchdog强杀。同时我们从FOOM分别出新的重启缘故起因叫“APP前台卡死导致重启”,列入重点关注。
三、结果
微信自2017年三月上线内存监控以来,办理了30多处大巨细小内存题目,涉及到谈天、搜刮、朋侪圈等多个业务,FOOM率由17年年初3%,降到如今0.67%,而前台卡死率由0.6%降落到0.3%,结果特别显着。
四、常见题目
UIGraphicsEndImageContext
UIGraphicsBeginImageContext和UIGraphicsEndImageContext必须成双出现,否则会造成context走漏。别的XCode的Analyze也能扫出这类题目。
UIWebView
无论是打开网页,还是实行一段简单的js代码,UIWebView都会占用APP大量内存。而WKWebView不但有出色的渲染性能,而且它有本身独立进程,一些网页相干的内存斲丧移到自身进程里,最得当取替UIWebView。
autoreleasepool
通常autoreleased对象是在runloop竣事时才开释。假如在循环里产生大量autoreleased对象,内存峰值会猛涨,乃至出现OOM。得当的添加autoreleasepool能及时开释内存,低落峰值。
相互引用
比力轻易出现相互引用的地方是block里利用了self,而self又持有这个block,只能通过代码规范来克制。别的NSTimer的target、CAAnimation的delegate,是对Obj强引用。如今微信通过本身实现的MMNoRetainTimer和MMDelegateCenter来规避这类题目。
大图片处理惩罚
举个例子,以往图片缩放接口是如许写的:
但处理惩罚大分辨率图片时,每每轻易出现OOM,缘故起因是-[UIImagedrawInRect:]在绘制时,先解码图片,再天生原始分辨率巨细的bitmap,这是很耗内存的。办理方法是利用更低层的ImageIO接口,克制中心bitmap产生:
大视图
大视图是指View的size过大,自身包罗要渲染的内容。超长文本是微信里常见的炸群消息,通常几千乃至几万行。假如把它绘制到同一个View里,那将会斲丧大量内存,同时造成严峻卡顿。最好做法是把文本分别成多个View绘制,利用TableView的复用机制,镌汰不须要的渲染和内存占用。
●MemoryUsagePerformanceGuidelines
https://developer.apple.com/library/content/documentation/Performance/Conceptual/ManagingMemory/ManagingMemory.html#//apple_ref/doc/uid/10000160-SW1
●Nopressure,Mon!
https://www.newosxbook.com/articles/MemoryPressure.html
腾讯WeTestiOS预审工具
为了进步IEG苹果考核通过率,腾讯专门创建了苹果考核测试团队,打造出iOS预审工具这款产物。颠末1年半的内部运营,腾讯内部应用的iOS考核通过率从均匀35%提拔到90%+。
现将腾讯内部产物的过审履历,以线上工具的情势共享给各位。在WeTest腾讯质量开放平台上可以在线利用。点击https://wetest.qq.com/product/ios即可立即体验!
假如利用当中有任何疑问,欢迎接洽腾讯WeTest企业QQ:800024531
iOS预审服务
【扫描工具】上传IPA包、图片、视频、应用形貌即可举行测试;多维度主动扫描提审质料的被拒风险;1小时内反馈全面的扫描陈诉。
【专家预审】腾讯专家为您遍历App全部功能模块;全面袒露App内容被拒风险;跟进题目直至上线(需提供官方拒绝邮件)。
【专家咨询】资深预审专家一对一服务;咨询时间机动可选,按需购买;对症下药解决考核题目。
【ASO优化】专业团队多维度深度分析App的ASO近况;围绕App目标用户群筛选高度关联的关键词;资助提拔App在苹果应用市肆中的曝光率。
我要评论