前言
众所周知,内存优化可以说是性能优化中最重要的优化点之一,可以说,如果你没有掌握系统的内存优化方案,就不能说你对Android的性能优化有过多的研究与探索;本篇将带领大家一起来系统地学习Android中的内存优化
可能有不少读者都知道,在内存管理上,JVM拥有垃圾内存回收的机制,自身会在虚拟机层面自动分配和释放内存,因此不需要像使用C/C++一样在代码中分配和释放某一块内存
Android系统的内存管理类似于JVM,通过new关键字来为对象分配内存,内存的释放由GC来回收; 并且Android系统在内存管理上有一个 Generational Heap Memory模型,当内存达到某一个阈值时,系统会根据不同的规则自动释放可以释放的内存。即便有了内存管理机制,但是,如果不合理地使用内存,也会造成一系列的性能问题,比如 内存泄漏、内存抖动、短时间内分配大量的内存对象 等等
什么是内存?
首先看下这里的内存到底指的是什么?可以看下面这张图:
● 手机中主要的存储部分分两块RAM和ROM,RAM存储程序的运行时数据,设备关机就会清空,我们也称之为内存;ROM也就是磁盘,存放一些永久的数据
● 上图我们看到这个RAM中还有一个zRAM分区,这个zRAM分区会在内存不足时发挥作用
● 到这里简单介绍了手机的内存是指什么,当我们不断打开APP时,手机的内存会被占的越来越多
低内存终止守护进程
很多时候,kswapd
不能为系统释放足够的内存。在这种情况下,系统会使用 onTrimMemory()
通知应用内存不足,应该减少其分配量。如果这还不够,内核会开始终止进程以释放内存。它会使用低内存终止守护进程 (LMK) 来执行此操作
LMK 使用一个名为 oom_adj_score
的“内存不足”分值来确定正在运行的进程的优先级,以此决定要终止的进程。最高得分的进程最先被终止。后台应用最先被终止,系统进程最后被终止
各种类别的说明
● 后台应用:之前运行过且当前不处于活动状态的应用。LMK 将首先从具有最高 oom_adj_score 的应用开始终止后台应用
● 上一个应用:最近用过的后台应用。上一个应用比后台应用具有更高的优先级(得分更低),因为相比某个后台应用,用户更有可能切换到上一个应用
● 主屏幕应用:这是启动器应用。终止该应用会使壁纸消失
● 服务:服务由应用启动,可能包括同步或上传到云端
● 可觉察的应用