关于可用内存的一些理解
不用在意剩余内存的大小,其实很多人都是把使用 Windows 的习惯带过来了。
Android 大多应用没有退出的设计其实是有道理的,这和系统对进程的调度机制有关系。其实和 Java 的垃圾回收机制类似,系统有一个规则来回收内存。进行内存调度有个阀值(minfree),只有低于这个值系统才会按一个列表来关闭用户不需要的东西。这个值默认设置得很小,所以你会看到可用内存总是在很少的数值徘徊。事实上绝大多数情况下可用内存并不影响 App 使用速度,相反加快了 App 下次再次被启动的速度,这本来就是 Android 的优势之一,如果人为去关闭进程,没有太大必要,特别是自动关进程的软件。
到这里有人可能会说,那为什么内存少的时候运行大型程序会慢呢?
原因是在内存剩余不多时打开大型程序,会触发系统自身的进程调度策略,这是十分消耗系统资源的操作,特别是在一个程序频繁向系统申请内存的时候。这种情况下系统并不会关闭所有打开的进程,而是选择性关闭,频繁的调度自然会拖慢系统。所以,有些更改内存阀值的程序可以有一定改善,但改动也可能带来一些问题,取决于值的设定。
那进程管理软件有无必要呢?
有的,就是在运行大型程序之前,我们可以手动关闭一些进程释放内存,可以显著的提高打开速度,但大多数 App,完全可交由系统自己管理,说到这里,可能有的朋友会问,如果不关后台是不是会更耗电?
Android 的应用在被切换到后台时,它其实已经被暂停了,并不会消耗 CPU 资源,只保留了运行状态,这也是为什么有的程序切出去后再次重进会直接到主界面。但是一个程序如果想要在后台运行,如音乐播放,它就会开启一个服务,服务可在后台持续运行,所以在后台耗电的也只有带服务的应用了。这个在一些进程管理的软件里可以看到,进程名字通常包含 service,至于 Activity 和广播接收器等就暂且不说了。所以后台没有服务(service)在运行的应用是完全不耗电的,没有必要关闭,这是一个非常好的设计,下次启动 App 时会更快,因为不需要读取界面资源,频繁关掉,说是抹杀这个 Android 的优点并不为过。
Android 上的应用是 Java 程序,每个应用带有独立虚拟机,也就是每开一个应用就会打开一个独立的虚拟机,这样设计的原因是可以避免虚拟机崩溃导致整个系统崩溃,其代价就是需要更多内存。
以上这些设计确保了 Android 的稳定性,正常情况下最多单个 App 崩溃,但整个系统不会崩溃,也永远没有内存不足的提示出现,频繁手动释放内存的朋友可能是受 Windows 的影响太深了,总想保留更多的内存,但实际上这并不一定会提升速度,相反却丧失了程序启动快的这一系统特色。
至于为什么开了大程序或者开了多个程序之后切换会变慢,我的理解是:
- 大程序 A 已经开启且占用了 70% 内存,如果再想运行一个 B,需要 50% 的内存,则就需要一个将 A 从内存中释放或者压缩的过程,所以表现出来的就是慢一会儿
- A + B + C + D + E 共占用内存 80%,运行新程序 Z 需要 20% 的内存,系统内存调度阀值正常不可能设置为 0,也就是应该剩一部分空闲内存,那么就需要从 A-E 这几个程序中选择一个或者几个来关闭,这一过程也需要耗费系统资源,所以会慢一会儿
- 手动去释放 App 内存的时候,就是替系统在释放内存,就算不手动释放,在需要内存的时候系统也会自动释放
- 不在后台运行的 App(后台没有 service 服务运行的),即使不关闭进程释放内存也不会耗电;在后台运行着的 App,如后台播放歌曲,当然会耗电
- 不是说关闭进程没有用,后台运行的服务进程会一直耗电,这样的应该关闭。以 QQ 为例,正常的退出,会在进程管理里留下 QQ 的运行状态,但这并不耗电也不占用 CPU 资源,如果只是切换出去(按 Home 键而不是退出 App),那么自然会耗电,因为程序一直在运行
最后,说说 Home 键和返回键的区别:
在运行一个 App 时,按一下 Home 键可以回到桌面,一般来说按一下返回键也可以回到桌面,这两者是有区别的。按 Home 键,看起来似乎是退出了,但其实这个 App 并没有被关闭,而是转为了后台进程
(指一般的 App,不讨论特别种类的 App);按返回键,看起来也是退出没错,但这个 App 其实是被转为了空进程
(音乐除外,音乐属于有服务的特殊 App),这方面的知识可以阅读Android 的六类进程,空进程
的级别是最低的,它存在的目的是为了下次打开这个 App 的时候可以更加方便快速(这是个很好的设计),而一旦需要清理出更多内存空间时,它也是被系统自动的最优先关闭释放的。
所以,一旦需要退出 App 时,如果是没有提供退出功能的 App,那么尽量用返回键退出而不是 Home 键。
再来说 Home 键,作为智能多任务系统,自然会有一个在多任务之间切换的需要。例如读邮件时遇到陌生单词,那就可以选中单词进行复制,按 Home 键切换到桌面,然后打开词典粘贴,查询,查好后再按近期任务列表,切换回邮件,这时候邮件 App 打开仍是刚才的界面……这就是 Home 键的功能,也就是一个前后台进程切换的过程。
所以,对很多程序而言,按返回键相当于“真正的”退出且关闭 App(App 转为空进程
);按 Home 键,看起来似乎是关闭了 App,但其实 App 只是被降低了等级(由前台进程
变为后台进程
),Home 键适合多任务切换使用,就是这样。
十九,地球人。咖啡控,不正经女程序员。
快进「电报」组!
最近更新
留言互动