当前位置:网站首页>ANR 原理及实践
ANR 原理及实践
2022-07-07 02:28:00 【Little xian】
Broadcast ANR 设计原理
- 只在有序广播中才会有ANR的监控
- AMS负责分发有序广播,并在分发的时候设置超时监控报警,如果广播接收者在超时时间范围内处理掉消息并和AMS通信取消本次超时监控则不会发生ANR,反之未取消则判定ANR。
- AMS是用过Binder机制和APP进程通信,当接受到广播数据,会封装数据再sendMessage到主线程消息队列,主线程处理Msg,最终调用receiver.onReceive方法。(当主线程消息队列前面有耗时任务,或者其他进程有耗时任务,影响了当前事件的调度,而不是本身事件耗时过长,也会引发ANR)
Service ANR 设计原理
Input ANR 设计原理
ANR Dump流程
- 过滤掉特殊场景(正在dump,正在关机,正在crash,正在被系统kill)
- 查找需要Dump的进程,主要包括ANR进程的父进程,SystemServer进程,高CPU的(最多5个)进程
- 发送SIGQUIT信号给需要Dump的进程
- 各进程SignalCatcher线程收集当前虚拟机信息,内存信息,class信息,GC信息,再挂起所有线程,获取线程的堆栈信息
- 最后通过管道发送给SystemServer,追加写入到Trace文件中
应用检测ANR
- watchdog
- 监听SIGNALQUIT信号,确定自己进程ANR时候,Java端获取堆栈信息,或者反射调用虚拟机内部Dump线程的堆栈接口,获取数据输出到自己的目录下。
实现参考Xcrash:https://github.com/iqiyi/xCrash/blob/master/README.zh-CN.md
获取ANR Info
- 通过ActivityManagerService.getProcessesInErrorState,遍历mLruProcesses,并根据进程目前的异常状态如crash或者anr类型,返回具体的ProcessErrorStateInfo
ANR出现前消息队列中耗时情况
- 当前 Trace 堆栈所在业务耗时严重;
- 当前 Trace 堆栈所在业务耗时并不严重,但是历史调度有一个严重耗时;
- 当前 Trace 堆栈所在业务耗时并不严重,但是历史调度有多个消息耗时;
- 当前 Trace 堆栈所在业务耗时并不严重,但是历史调度存在巨量重复消息(业务频繁发送消息);
- 当前 Trace 堆栈业务逻辑并不耗时,但是其他线程存在严重资源抢占,如 IO,Mem,CPU;
- 当前 Trace 堆栈业务逻辑并不耗时,但是其他进程存在严重资源抢占,如 IO,Mem,CPU;
ANR日志语义分析
Load: 2.62 / 2.55 / 2.25
表示:1、5、15 分钟内正在使用和等待使用CPU 的活动进程的平均数CPU usage from 0ms to 1987ms later (2020-03-10 08:31:55.169 to 2020-03-10 08:32:17.156)
表明:负载信息抓取在ANR发生之后的0~1987ms。同时也指明了ANR的时间点:2020-03-10 08:31:55.169
如果是 CPU usage xxx awake 表示是ANR之前的系统负载信息41% 2080/system_server: 28% user + 12% kernel / faults: 76445 minor 180 major 26% 9378/com.xiaomi.store: 20% user + 6.8% kernel / faults: 68408 minor 68 major
表示:各个进程占用的CPU的详细情况66% TOTAL: 20% user + 15% kernel + 28% iowait + 0.7% irq + 0.7% softirq
表示:各进程合计占用CPU的信息
ANR 关键字
a. user:用户态,kernel:内核态
b. faults:内存缺页,minor——轻微的,major——重度,需要从磁盘拿数据
c. iowait:IO使用(等待)占比
d. irq:硬中断,softirq:软中断
e. utm: user space time,stm: kernel space time
参考:
边栏推荐
- Unity C# 函数笔记
- 循环肿瘤细胞——Abnova 解决方案来啦
- MySQL(十)
- impdp的transform参数的测试
- Networkx绘图和常用库函数坐标绘图
- Ha Qu projection dark horse posture, only half a year to break through the 1000 yuan projector market!
- How can I check the DOI number of a foreign document?
- Shared memory for interprocess communication
- Redhat5 installing vmware tools under virtual machine
- MYSQL binlog相关命令
猜你喜欢
JESD204B时钟网络
Audio distortion analysis of DSP and DAC based on adau1452
Abnova循环肿瘤DNA丨全血分离,基因组DNA萃取分析
Go straight to the 2022ecdc fluorite cloud Developer Conference: work with thousands of industries to accelerate intelligent upgrading
What are the classic database questions in the interview?
MySQL的安装
Navicat导入15G数据报错 【2013 - Lost connection to MySQL server during query】 【1153:Got a packet bigger】
力扣62 不同路径(从矩阵左上到右下的所有路径数量) (动态规划)
Redis (II) - redis General Command
港科大&MSRA新研究:关于图像到图像转换,Fine-tuning is all you need
随机推荐
反射(二)
C面试24. (指针)定义一个含有20个元素的double型数组a
MySQL installation
品牌电商如何逆势增长?在这里预见未来!
一段程序让你明白什么静态内部类,局部内部类,匿名内部类
Apache ab 压力测试
DB2获取表信息异常:Caused by: com.ibm.db2.jcc.am.SqlException: [jcc][t4][1065][12306][4.25.13]
Markdown displays pictures side by side
C interview encryption program: input plaintext by keyboard, convert it into ciphertext through encryption program and output it to the screen.
Audio distortion analysis of DSP and DAC based on adau1452
What books can greatly improve programming ideas and abilities?
当前发布的SKU(销售规格)信息中包含疑似与宝贝无关的字
impdp的transform参数的测试
如何解决数据库插入数据显示SQLSTATE[HY000]: General error: 1364 Field ‘xxxxx‘ doesn‘t have a default value错误
使用TCP/IP四层模型进行网络传输的基本流程
Abnova 体外转录 mRNA工作流程和加帽方法介绍
LM11丨重构K线构建择时交易策略
【解决】Final app status- UNDEFINED, exitCode- 16
SVN version management in use replacement release and connection reset
PostgreSQL database timescaledb function time_ bucket_ Gapfill() error resolution and license replacement