Android 系统不释放内存吗?
除了 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:
打开知乎这个程序之后,系统剩余内存:
知乎占用的内存:
使用任务管理器杀掉知乎(直接杀掉进程),系统剩余内存:
可以看到,杀掉进程之后,系统可用内存是会增加的。
据说即使前台关掉进程,其实该进程在后台还在运行?
这个和第一条一样,取决于你关掉进程的方法:
- 如果是按 Back 键,那么该进程还是会在后台。是否在运行,则要取决于这个应用的行为,有的应用 Back 到后台之后,其优先级会降到 Cache,系统内存不足或者触发 Cache 进程的数量限制,都会被系统直接杀掉,回收内存;有的应用 Back 到后台之后,会触发一些后台任务,起个 Service 之类的,还是会继续运行,比如导航软件和听歌软件
- 如果是按 Home 键,那么该进程依然会在后台,其大部分资源都没有释放,包括 Activity、Service 等。是否在运行,与 Back 到后台的行为一样,取决于应用的行为。
- 如果是被任务管理器或者命令行(Force Stop)杀掉,那么除非自启动(很多国内的应用被杀之后都会走自启动模式,同样很多国内的手机厂商,都会禁止应用被杀后走自启动模式,或者被其他进程唤醒,一般有名单进行控制,名单内的可以自启动,其他的自己想办法),应用是不会在后台运行的。
从上面的三个逻辑来看,用户最佳的使用方法应该遵循下面的建议:
- 如果是正在使用的应用,临时切出去干个别的事情,一会还要切回来,那么使用 Home 键把当前应用退到后台最佳
- 如果是不想看了,想退出应用了,那么使用 Back 键把当前应用退到后台最佳
- 如果不希望这个应用退到后台之后还有可能运行,或者想释放内存,那么用任务管理器把这个应用直接杀掉最好(推荐一键全杀,国内的 Rom 基本都有)
上面也讲到,国内的手机厂商,都会禁止应用被杀后走自启动模式,或者被其他进程唤醒,一般有名单进行控制,这样做是为什么呢?厂商这么做无非是为了限制应用对资源的占用,一个应用退到后台之后,系统肯定是希望其占用最少的资源,能不占资源最好(cpu、gpu、io、memory),但是国内的部分应用却没那么安分守己,大家肯定听说过全家桶和相互唤醒,应用被杀了没问题,我另外一个应用偷偷把你拉起来就可以了,这拉起来的过程就占用了系统的资源,可能会导致前台应用出现卡顿,或者导致整机内存不足,所以厂商对应用的限制是无可厚非的。
那么应用为什么要抱团取暖,相互唤醒呢?第四个问题就是说这个的。
智能手机无需将程序彻底关掉,可以减少再启动的时间。是这样吗?
这句话没毛病,但是是有前提的,前提就是,如果这个应用在后台可以安分守己,至于现实嘛..不说大家也知道,参考百度全家桶
Android设计的时候,确实是想让大家不去关心内存问题,Android会有一套自己的内存管理机制,在内存不足的时候通过优先级干掉一些应用。每个应用在接收到内存不足的信号,需要根据内存不足的程度,来释放掉一部分内存.以保持自己的进程不被杀死,这样下次启动的时候就不用去fork zygote,这样的话,下一次启动的时间确实会少很多,也就是大家常说的冷启动和热启动的差距。
但是……………..凡是总有个但是,理想是丰满的,现实是很残酷的。严格按照Google想的那一套去做的应用不多,国内开发者对内存的敏感程度很低,导致很多应用程序跑起来分分钟就100-200MB 了,墨迹天气这样的应用,400m 妥妥的(不好意思又黑了墨迹天气) 。所以手机低内存的情况非常常见,所以低内存的情况会很频繁。这时候你再起一个应用,申请内存的时候发现内存不够,就开始杀应用了。
所以经常会出现你在看电子书,突然这时候微信来了个消息,你切过去回了个消息,打开相机拍了个照,然后发给朋友,又发了条微博,再回来看书的时候发现电子书已经挂了,正在重新加载程序….WLGQ…
这时候你就发现限制后台进程的重要性了,把不重要的进程直接干掉,限制应用的自启动和相互唤醒,保证重要的进程不会被系统杀掉,也就保证了用户的基本使用体验。
所以说不重要的程序是需要在使用结束后直接干掉的.一劳永逸,麻麻再也不用担心这货偷跑流量/后台安装程序/占内存/占 CPU 了….
再说后半句: 可以减少启动的时间. 这个是对的, 如果一个应用程序的进程没有被杀死,那么下一次启动这个应用程序的时候,就不需要去创建这个进程了(fork zygote,这个耗时还是蛮多的), 而是直接在这个进程中创建对应的组件即可(Android四大组件),速度比冷启动要快很多。
以汽车发动为例:
- 冷启动相当于 上车 -> 拧钥匙 -> 等发动机启动 -> 踩刹车换挡 -> 放手刹 -> Go
- 热启动相当于 上车 -> 踩刹车换挡 -> 放手刹 -> Go
关于 Android 内存的其他一些问题
这里来简单解答一下第一段中提到的那些问题
- Android 系统是怎么管理内存的呢? – 这个嘛,后续再详细讲
- 应用到底占了多少内存? – 这个嘛,后续再详细讲
- 系统到底占了多少内存? – 这个嘛,后续再详细讲
- 内存对我手机的使用体验有什么影响?– 低内存会影响整机的流畅性和响应速度,也会导致杀应用变得很频繁,用户体验差。
- 到底怎么才能用好 Android 手机?– 买 Android 旗舰,多用任务管理器的全杀功能,尽量禁止应用后台运行(Flyme 用户可以在手机关机里面设置)
- 换新手机换多大内存的会比较合适呢? – 越大越好,6G 起步,8G 最佳。
内存相关的文章参考
- Android代码内存优化建议-Java官方篇
- Android代码内存优化建议-Android资源篇
- Android代码内存优化建议-Android官方篇
- Android代码内存优化建议-OnTrimMemory优化
- Android性能优化典范之Understanding Overdraw
- Android性能优化之过渡绘制(一)
- Android性能优化之过渡绘制(二)
- Android内存优化之一:MAT使用入门
- Android内存优化之二:MAT使用进阶
- Android内存优化之三:打开MAT中的Bitmap原图
- 关于 Android 系统流畅性的一些思考
关于我 && 博客
下面是个人的介绍和相关的链接,期望与同行的各位多多交流,三人行,则必有我师!
- 博主个人介绍 :里面有个人的微信和微信群链接。
- 本博客内容导航 :个人博客内容的一个导航。
- 个人整理和搜集的优秀博客文章 - Android 性能优化必知必会 :欢迎大家自荐和推荐 (微信私聊即可)
- Android性能优化知识星球 : 欢迎加入,多谢支持~
一个人可以走的更快 , 一群人可以走的更远