2024年Android的进程优先级与进程回收详解(2),面试的知识点

最后

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【算法合集】

【延伸Android必备知识点】

【Android部分高级架构视频学习资源】

Android精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

特征

1.如果一个进程里面同时包含service和可视的activity,那么这个进程应该归于可视进程,而不是service进程.

2.另外,如果其他进程依赖于它的话,一个进程的等级可以提高.例如,一个A进程里的service被绑定到B进程里的组件上,进程A将总被认为至少和B进程一样重要.

3.系统中的phone服务被划分到前台进程而不是次要服务进程.

在android中以进程的oom_adj值也就代表了它的优先级.

oom_adj值越高代表该进程优先级越低.

adb shell cat /proc//oom_adj 查看某个进程当前的oom_adj值

进程oom_adj值的更新:

android进程的oom_adj都在ActivityManagerService中更新


updateOomAdjLocked() =>

int adj = computeOomAdjLocked(app, hiddenAdj, TOP\_APP, false);\[/font\]

Process.setOomAdj(app.pid, adj) \=>\[/font\]

android\_os\_Process\_setOomAdj \[color\=lime\]//android\_util\_Process.cpp

进程回收lowmemorykiller:

参考lowmemorykiller.c 的lowmem_shrink函数,计算哪些进程该回收,并发送SIGKILL信号将该进程KILL。


    if (selected) {

        lowmem\_print(1, "send sigkill to %d (%s), adj %d, size %d\\n",

                 selected\->pid, selected->comm,

                 selected\_oom\_adj, selected\_tasksize);

        lowmem\_deathpending \= selected;

        lowmem\_deathpending\_timeout \= jiffies + HZ;

        force\_sig(SIGKILL, selected);



        nr\_samples\--;

        rem \-= selected\_tasksize;

    }

oom_adj等级设置在init.rc中:


\# Define the memory thresholds at which the above process classes will

# be killed.  These numbers are in pages (4k).

    setprop ro.FOREGROUND\_APP\_ADJ 0

    setprop ro.VISIBLE\_APP\_ADJ 1

    setprop ro.SECONDARY\_SERVER\_ADJ 2

    setprop ro.HIDDEN\_APP\_MIN\_ADJ 7

    setprop ro.CONTENT\_PROVIDER\_ADJ 14

    setprop ro.EMPTY\_APP\_ADJ 15

init.rc中,将PID为1的进程(init进程)的oom_adj设置为-16:


    # Set init its forked children's oom\_adj.

    write /proc/1/oom\_adj -16

查看本机设置:


cat /sys/module/lowmemorykiller/parameters/adj

0,1,2,7,14,15

回收时机:

init.rc中:


\# Write value must be consistent with the above properties.

# Note that the driver only supports 6 slots, so we have combined some of

# the classes into the same memory level; the associated processes of higher

# classes will still be killed first.

setprop ro.FOREGROUND\_APP\_MEM 1536

setprop ro.VISIBLE\_APP\_MEM 2048

setprop ro.SECONDARY\_SERVER\_MEM 4096

setprop ro.HIDDEN\_APP\_MEM 5120

setprop ro.CONTENT\_PROVIDER\_MEM 5632

setprop ro.EMPTY\_APP\_MEM 6144

这些数字也就是对应的内存阈值,一旦低于该值,Android便开始按顺序关闭相应的进程 .

注意这些数字的单位是page. 1 page = 4 kB.

上面的六个数字对应的就是(MB): 6,8,16,20,22,24

查看现在的设置可以:

cat /sys/module/lowmemorykiller/parameters/minfree

要想重新设置该值(对应不同的需求):

echo “1536,2048,4096,5120,15360,23040”>/sys/module/lowmemorykiller/parameters/minfree

这样当可用内存低于90MB的时候便开始结束空进程. 而当可用内存低于60MB的时候才开始结束内容供应节点.

具体的回收实现在ActivityManagerService.java中的函数trimApplications()

1.首先移除package被移走的无用进程.

2.基于进程当前状态,更新oom_adj值,然后进行以下操作.

移除没有activity在运行的进程

如果AP已经保存了所有的activity状态,结束这个AP.

3.最后,如果目前还是有很多activities 在运行,那么移除那些activity状态已经保存好的activity.

当系统内存短缺时Android的Low Memory Killer根据需要杀死进程释放其内存

简单说就是寻找一个最合适的进程杀死,从而释放它占用的内存.

最合适:

•oom_adj越大

•占用物理内存越多

查看LRU列表:Adb shell dumpsys activity

当activitydemo在前台时:

包含Service的进程的优先级比较高,在computeOomAdjLocked

【延伸Android必备知识点】

【Android部分高级架构视频学习资源】

**Android精讲视频学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水!

**任何市场都是优胜略汰适者生存,只要你技术过硬,到哪里都不存在饱和不饱和的问题,所以重要的还是提升自己。懂得多是自己的加分项 而不是必须项。门槛高了只能证明这个市场在不断成熟化!**另外一千个读者就有一千个哈姆雷特,所以以上只是自己的关键,不喜勿喷!

如果你是卡在缺少学习资源的瓶颈上,那么刚刚好我能帮到你。欢迎关注会持续更新和分享的。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

的瓶颈上,那么刚刚好我能帮到你。欢迎关注会持续更新和分享的。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值