主要观点总结
本文介绍了卡顿、ANR和死锁监控方案的原理和方法,包括卡顿原理、卡顿监控、ANR触发流程、ANR分析方法和监控方式,以及死锁导致的ANR和死锁监控。文章还提到了如何形成闭环监控流程,并在发生ANR时获取主线程堆栈信息和死锁线程堆栈信息,上报到服务器,并定位到最后修改代码的同学。
关键观点总结
关键观点1: 卡顿原理
卡顿通常是由于主线程有耗时操作导致的,超过阈值会触发ANR。卡顿可能由MessageQueue#next阻塞或Handler的dispatchMessage耗时太久引起。
关键观点2: 卡顿监控
卡顿监控可以通过Looper提供的Printer接口计算Handler处理一个消息的耗时,判断是否出现卡顿。也有使用字节码插桩技术,在编译期插入代码统计方法耗时。
关键观点3: ANR触发流程
ANR触发流程可以比喻为埋炸弹和拆炸弹的过程,如Service、BroadcastQueue、ContentProvider、InputDispatching的超时会导致ANR。
关键观点4: ANR分析方法
ANR的分析通常通过分析/data/anr/traces.txt文件,获取主线程和其他线程的堆栈信息。
关键观点5: ANR监控方式
ANR监控可以通过抓取系统traces.txt文件上传、使用ANRWatchDog库、优化后的ANRMonitor等方式进行。
关键观点6: 死锁导致的ANR和死锁监控
死锁导致的ANR可以通过获取当前blocked状态的线程、目标锁被哪个线程持有、找到一直不释放锁的线程、通过算法找到死锁线程,并输出堆栈信息。
关键观点7: 形成闭环
将卡顿监控、ANR监控和死锁监控连接起来,在发生ANR时,将整个监控流程形成一个闭环,包括获取主线程堆栈信息、检测死锁、获取死锁对应线程堆栈信息、上报到服务器等。
文章预览
本文作者 作者: 蓝师傅 链接: https://juejin.cn/post/6973564044351373326 本文由作者授权发布。 1 前言 最近参加了几轮面试,发现很多5-7年工作经验的候选人在性能优化这一块,基本上只能说出传统的分析方式,例如ANR分析,是通过查看/data/anr/ 下的log,分析主线程堆栈、cpu、锁信息等。 然而,这种方法有一定的局限性,并不是每次都奏效,很多时候是没有堆栈信息给你分析的,例如有些高版本设备需要root权限才能访问/data/anr/ 目录,或者是线上用户的反馈,只有一张ANR的截图加上一句话描述。 假如你的App没有实现ANR监控上报,那么你大概率会把这个问题当成“未复现”处理掉,而没有真正解决问题。 于是我整理了这一篇文章,主要关于卡顿、ANR、死锁监控方案。 2 卡顿原理和监控 2.1 卡顿原理 一般来说,主线程有耗时操作会导致卡顿,卡顿超过阈值
………………………………