Android Performance

Android 系统不释放内存吗?

字数统计: 2.9k阅读时长: 9 min
2018/09/13 Share

除了 CPU,很多用户在选购手机的时候通常也会考虑内存大小,不同版本内存的手机价格也不一样,买多大内存的合适呢?Android 系统是怎么管理内存的呢?普通用户对 Android 手机的内存使用总是一头雾水,这个应用到底占了多少内存?系统到底占了多少内存?内存对我手机的使用体验有什么影响?到底怎么才能用好 Android 手机?换新手机换多大内存的会比较合适呢?

知乎上有一个问题,一个用户问 “Android 系统不释放内存吗?”,用户并不是不知道系统会释放内存,而是想知道其中的细节,好优化使用的体验,下面我就从用户的几个问题入手,来简单说明一下,比较深入的细节我后续的文章会详细介绍。

同时也会对第一段中提到的几个问题提出一些个人的见解,欢迎一起来讨论,留下你的问题,提出你的见解,大家共同进步。

Android系统下关闭程序后,系统内存并不释放?

这个是不准确的,只能说对了一半. 你所描述的”android系统下关闭程序”,指的是怎么个关闭法呢?目前阶段有好几种关闭程序的方法:

点击Back键退出.

这种退出的方法, 进程是否被杀掉,取决于这个应用程序的实现. 举个栗子,如果你创建一个空的应用, 这时候查看系统内存信息(包名为com.exmaple.gaojianwu.myapplication,pid为5708,内存为13910kb):

可以看到,这个应用程序的pid为5708 , 其优先级为Foreground,即前台程序.

这时候我们点击Back键退出,然后再查看系统的内存信息(adb shell dumpsys meminfo)

我们看到,这个程序在 Back 键之后,其进程 5708 依旧是存在的.只是其进程优先级变成了Cache.其占用内存变成了 12337kb,和之前的 13910kb 相比是变小了一些. 但是大部分内存是没有被释放掉的.

在任务管理器中杀掉应用

在任务管理器中杀掉应用,这个结果是不一致的,其取决于这个OS的任务管理器的实现,大部分国内的厂家都会对任务管理器进行定制,以达到更有效的杀掉应用的效果.一般来说厂家定制的任务管理器都会比较暴力,除了少数白名单,其他的应用一概直接将进程杀掉

我们以上面的那个测试程序为例,打开这个程序之后, 其进程优先级为Foreground,这时候我们直接调用任务管理器杀掉改程序(以魅族MX4 Pro为栗子):

可以看到用任务管理器杀掉之后, 整个应用程序的进程都被杀掉了.

通过命令行或者开发者工具杀掉应用

我们可以通过 adb shell am force-stop 包名来杀掉这个程序,其结果也是进程直接被杀掉,IDE(比如Android Studio)选择一个进程后,点击图中的按钮

也是可以干掉这个进程的. 这时候进程是被直接杀掉的。

即使关掉后台进程,内存也增加不多?

这个不对,一个进程被杀死后,其内存会被释放掉的,不管是虚拟机内存还是 Native 内存还是图像所申请的内存,都会被系统回收,放到可用内存中。

我们以知乎 App Android客户端为栗子,打开这个程序之前,系统剩余内存 1.8G:

打开知乎之前,系统剩余内存

打开知乎这个程序之后,系统剩余内存:

打开知乎之后,系统剩余内存

知乎占用的内存:

知乎内存占用

使用任务管理器杀掉知乎(直接杀掉进程),系统剩余内存:

杀掉知乎知乎系统剩余内存

可以看到,杀掉进程之后,系统可用内存是会增加的。

据说即使前台关掉进程,其实该进程在后台还在运行?

这个和第一条一样,取决于你关掉进程的方法:

  1. 如果是按 Back 键,那么该进程还是会在后台。是否在运行,则要取决于这个应用的行为,有的应用 Back 到后台之后,其优先级会降到 Cache,系统内存不足或者触发 Cache 进程的数量限制,都会被系统直接杀掉,回收内存;有的应用 Back 到后台之后,会触发一些后台任务,起个 Service 之类的,还是会继续运行,比如导航软件和听歌软件
  2. 如果是按 Home 键,那么该进程依然会在后台,其大部分资源都没有释放,包括 Activity、Service 等。是否在运行,与 Back 到后台的行为一样,取决于应用的行为。
  3. 如果是被任务管理器或者命令行(Force Stop)杀掉,那么除非自启动(很多国内的应用被杀之后都会走自启动模式,同样很多国内的手机厂商,都会禁止应用被杀后走自启动模式,或者被其他进程唤醒,一般有名单进行控制,名单内的可以自启动,其他的自己想办法),应用是不会在后台运行的。

从上面的三个逻辑来看,用户最佳的使用方法应该遵循下面的建议:

  1. 如果是正在使用的应用,临时切出去干个别的事情,一会还要切回来,那么使用 Home 键把当前应用退到后台最佳
  2. 如果是不想看了,想退出应用了,那么使用 Back 键把当前应用退到后台最佳
  3. 如果不希望这个应用退到后台之后还有可能运行,或者想释放内存,那么用任务管理器把这个应用直接杀掉最好(推荐一键全杀,国内的 Rom 基本都有)

上面也讲到,国内的手机厂商,都会禁止应用被杀后走自启动模式,或者被其他进程唤醒,一般有名单进行控制,这样做是为什么呢?厂商这么做无非是为了限制应用对资源的占用,一个应用退到后台之后,系统肯定是希望其占用最少的资源,能不占资源最好(cpu、gpu、io、memory),但是国内的部分应用却没那么安分守己,大家肯定听说过全家桶和相互唤醒,应用被杀了没问题,我另外一个应用偷偷把你拉起来就可以了,这拉起来的过程就占用了系统的资源,可能会导致前台应用出现卡顿,或者导致整机内存不足,所以厂商对应用的限制是无可厚非的。

百度全家桶

那么应用为什么要抱团取暖,相互唤醒呢?第四个问题就是说这个的。

智能手机无需将程序彻底关掉,可以减少再启动的时间。是这样吗?

这句话没毛病,但是是有前提的,前提就是,如果这个应用在后台可以安分守己,至于现实嘛..不说大家也知道,参考百度全家桶

Android设计的时候,确实是想让大家不去关心内存问题,Android会有一套自己的内存管理机制,在内存不足的时候通过优先级干掉一些应用。每个应用在接收到内存不足的信号,需要根据内存不足的程度,来释放掉一部分内存.以保持自己的进程不被杀死,这样下次启动的时候就不用去fork zygote,这样的话,下一次启动的时间确实会少很多,也就是大家常说的冷启动和热启动的差距。

但是……………..凡是总有个但是,理想是丰满的,现实是很残酷的。严格按照Google想的那一套去做的应用不多,国内开发者对内存的敏感程度很低,导致很多应用程序跑起来分分钟就100-200MB 了,墨迹天气这样的应用,400m 妥妥的(不好意思又黑了墨迹天气) 。所以手机低内存的情况非常常见,所以低内存的情况会很频繁。这时候你再起一个应用,申请内存的时候发现内存不够,就开始杀应用了。

所以经常会出现你在看电子书,突然这时候微信来了个消息,你切过去回了个消息,打开相机拍了个照,然后发给朋友,又发了条微博,再回来看书的时候发现电子书已经挂了,正在重新加载程序….WLGQ…

这时候你就发现限制后台进程的重要性了,把不重要的进程直接干掉,限制应用的自启动和相互唤醒,保证重要的进程不会被系统杀掉,也就保证了用户的基本使用体验。

所以说不重要的程序是需要在使用结束后直接干掉的.一劳永逸,麻麻再也不用担心这货偷跑流量/后台安装程序/占内存/占 CPU 了….

再说后半句: 可以减少启动的时间. 这个是对的, 如果一个应用程序的进程没有被杀死,那么下一次启动这个应用程序的时候,就不需要去创建这个进程了(fork zygote,这个耗时还是蛮多的), 而是直接在这个进程中创建对应的组件即可(Android四大组件),速度比冷启动要快很多。

以汽车发动为例:

  1. 冷启动相当于 上车 -> 拧钥匙 -> 等发动机启动 -> 踩刹车换挡 -> 放手刹 -> Go
  2. 热启动相当于 上车 -> 踩刹车换挡 -> 放手刹 -> Go

关于 Android 内存的其他一些问题

这里来简单解答一下第一段中提到的那些问题

  1. Android 系统是怎么管理内存的呢? – 这个嘛,后续再详细讲
  2. 应用到底占了多少内存? – 这个嘛,后续再详细讲
  3. 系统到底占了多少内存? – 这个嘛,后续再详细讲
  4. 内存对我手机的使用体验有什么影响?– 低内存会影响整机的流畅性和响应速度,也会导致杀应用变得很频繁,用户体验差。
  5. 到底怎么才能用好 Android 手机?– 买 Android 旗舰,多用任务管理器的全杀功能,尽量禁止应用后台运行(Flyme 用户可以在手机关机里面设置)
  6. 换新手机换多大内存的会比较合适呢? – 越大越好,6G 起步,8G 最佳。

内存相关的文章参考

  1. Android代码内存优化建议-Java官方篇
  2. Android代码内存优化建议-Android资源篇
  3. Android代码内存优化建议-Android官方篇
  4. Android代码内存优化建议-OnTrimMemory优化
  5. Android性能优化典范之Understanding Overdraw
  6. Android性能优化之过渡绘制(一)
  7. Android性能优化之过渡绘制(二)
  8. Android内存优化之一:MAT使用入门
  9. Android内存优化之二:MAT使用进阶
  10. Android内存优化之三:打开MAT中的Bitmap原图
  11. 关于 Android 系统流畅性的一些思考
CATALOG
  1. 1. Android系统下关闭程序后,系统内存并不释放?
    1. 1.1. 点击Back键退出.
    2. 1.2. 在任务管理器中杀掉应用
    3. 1.3. 通过命令行或者开发者工具杀掉应用
  2. 2. 即使关掉后台进程,内存也增加不多?
  3. 3. 据说即使前台关掉进程,其实该进程在后台还在运行?
  4. 4. 智能手机无需将程序彻底关掉,可以减少再启动的时间。是这样吗?
  5. 5. 关于 Android 内存的其他一些问题
  6. 6. 内存相关的文章参考