据安卓绿色联盟消息,随着手机内存不断增大,应用的功能也日益复杂。每个App都有自己的进程,每个进程都有自己的内存空间,这样做的好处是当App出现问题的时候,系统仅仅杀死当前进程,不会导致其他的App受到牵连,回收之后释放出内存给其他App用。
其中前台进程就是正在与用户交互的进程,即当前使用App的进程。手机内存空间是一定的,并且需要协作和相互切换的应用越来越多,如果当前App使用的进程占用内存较大,那么预留给其他应用的内存就会变小,用户在使用过程中会感觉应用越用越卡,影响用户体验。
手机系统内存机制工作原理
用户在选择“退出”、“关闭”执行后,应用进程会被直接杀死,有些应用的生命周期并不由应用自身直接控制,而取决于系统。当系统需要释放内存来运行新的进程或者保证某些后台进程和前端进程顺利执行的时候才会释放应用内存资源。
分配机制
采用弹性的分配方式为每个进程分配内存,即刚开始并不会给应用分配很多的内存,而是给每一个进程分配一个“够用”的内存大小。这个大小值是根据每一个设备的实际的内存大小来决定的。随着应用的运行和使用,系统会为进程分配一些额外的内存大小。但是分配的大小是有限度的,系统不可能为每一个应用分配无限大小的内存。
回收机制
“尽最大限度的使用”:只有当内存不足的时候,才会杀死其他进程来回收足够的内存。但系统不可能随便的杀死一个进程,它也有一个机制杀死进程来回收内存。
杀死进程有两个参考条件:
1.进程优先级
系统为每一个进程分配了优先组的概念,优先组越低的进程,被杀死的概率就越大。
2. 回收收益
系统会判断每个进程杀死后带来的回收收益,因为系统总是倾向于杀死一个能回收更多内存的进程,从而可以杀死更少的进程,来获取更多的内存。杀死的进程越少,对用户体验的影响就越小。
内存过高的影响
主要的影响包括:1.应用卡顿,响应速度慢;2.应用从后台进程变为空进程;3.应用莫名的崩溃等。出现的这些现象会严重影响用户体验。
测试方案
测试环境及操作步骤
1.测试环境
硬件环境:荣耀Magic 2 8+128g
软件版本:9.0.0
2.测试范围
本次测试选取了8款主流新闻类App附版本:
3.预置条件
手机未安装其他第三方应用,并且应用都是首次安装
手机卸载手机管家
4.操作步骤
下载并打开一个App,进入主页后,等待30s,获取应用内存信息,对应用进行耗时100s的测试,其中每6s自动采集一次测试数据;分别对首次启动、页面滑动和页面切换三种高频用户使用场景的数据信息进行采集整理
5.测试结果
从以上首次启动场景结果来看,8款应用中首次启动时由于需要加载和初始化信息,导致第一条测试数据明显偏大,待稳定之后,整体呈缓慢下降趋势。其中天天快报降幅明显,降幅为130MB左右。网易新闻在首次启动场景中内存消耗最大,平均为318.67MB,高出表现最好的新浪新闻138个百分点。
在页面滑动,即快速浏览场景中,从以上结果可以看出,同类应用内存消耗大不相同,整体呈缓慢增长趋势,各应用之间的内存差值达到414.23MB。其中今日头条增幅最大,增幅近250MB左右。
在页面切换场景中,从以上结果可以看出,在切换场景中由于需要加载的数据逐渐增多,导致整体增长相对迅猛,其中天天快报增幅最大,增幅347.72MB;其次是腾讯新闻,增幅354.68MB。
6.问题分析
今日头条应用在快速浏览场景下内存增幅明显,通过对比启动时场景的内存,发现Native堆内存使用量明显增多,说明该场景下使用了较多的Native层实现优化代码执行效率。
天天快报应用在页面切换场景下内存增幅明显,通过对比启动时场景的内存,发现Native堆内存使用量明显增多。
7.优化建议
1、必要时释放内存以响应事件
2、后台服务在任务完成后应该停止运行,避免内存泄漏
3、使用优化的数据容器,包括SparseArray,SparseBooleanArray,和LongSparseArray等如果没有明显的好处,避免使用代码抽象(时间和内存成本较高)
4、使用nano protobufs进行序列化数据
5、避免频繁创建临时对象,以免短时间内造成大量垃圾回收事件
6、从代码中删除冗余,不必要或臃肿的组件、资源或库,如果打算在APK中使用依赖注入框架,考虑使用Dagger 2