β

Android 系统不释放内存吗?

Android Performance 7 阅读

除了 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 系统流畅性的一些思考

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

作者:Android Performance
原文地址:Android 系统不释放内存吗?, 感谢原作者分享。

发表评论