OOM问题原理解析(一):adj内存管理机制,Android程序员面试必备的知识点

本文深入探讨Android的OOM(Out of Memory)问题,分析Adj内存管理机制,特别是服务的A-Service与B-Service分类。讲解了perceptible服务的定义,如何查询应用的adj级别,以及未控制好oom_adj可能导致的问题,如UI进程启动服务的隐患和如何避免ANR。建议Android开发者理解并掌握这些知识,以优化应用性能和面试准备。
摘要由CSDN通过智能技术生成

*所有启动了服务的进程,且该服务所在的进程没有显示过UI,且该服务未执行startForeground(执行后会变为perveptible服务)动作,那该进程则为A-Service与B-Service中的一种。然后根据这类服务进程所处于Lru进程表中的位置,前1/3点服务为A-Service,其余的则为B-Service。*

*4.perceptible的标准*

*perceptible名为可感知的进程,但并不是说能够感知到进程就一定表示该进程属于perveptible进程,比如播放音乐的进程活着状态栏上有通知的进程,虽然能够感知到进程的存在,但是不代表进程一定时perceptible类别的进程。决定该进程是否属于perceptible进程并未进程的可感知性,而是该进程的服务是否执行了startForeground动作。*

*二、如何查询应用的adj级别*

*1.dumpsys meminfo*

*使用dumpsys meminfo命令时,会列出当前系统的所有进程,不同进程放入不同的分类,对应的分类名基本与lmk的分类一致。有一点不同的就是,退到后台启动了服务且显示过UI的进程,在dumpsys meminfo命令中会归为b service一类,但从lmk角度分配的oom_adj值为9~16的范围,属于cached一类*

*2.cat /proc/[PID]/oom_adj: 使用该命令会直接显示出对应进程号的adj值*

*三、未控制好oom_adj的案例*

*1.ui进程启动service的隐患*

*案例a:备份进程启动一个服务开始执行备份,备份服务运行在ui进程(服务未调用startForeground())*

*隐患:备份服务一般需要较长时间,在用户按Home键退出后台后,备份进程会处于previous状态,继续使用手机其他应用,会是使得备份进程处于cch-started-ui-services的状态,即是启动了服务并且包含ui的进程退到后台状态,此时进程的adj值处于9~16,随着时间推移逐渐增大。如果在较长的备份过程中,触发了lowmemorykiller,很容易导致备份进程被杀掉,从而导致备份的失败。*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值