因为很多进程你是无法通过清理后台关闭掉的,比如你清理完后台,你的微信,qq,淘宝,钉钉等等软体其实都在后台保留一个进程用来接收伺服器发来的消息,如果这个进程被关闭的话,你将无法收到消息。这是安卓系统的一个消息接收机制。

但如果仅仅是保留消息接收进程其实也占不了多少内存,麻烦就麻烦在国内这些个流氓软体会相互唤醒,并且常驻后台,以此营造出一种快速启动的假象。(程序一直在后台运行著,启动自然就快了很多)比如你打开了支付宝,同一时间,淘宝,咸鱼,饿了吗,等等一系列阿里系的app被唤醒。在流氓软体们眼里,内存就那么大,不占白不占,自己不占就会被竞争对手们占走了。因此安卓手机的内存越做越大,但其实并没有从根本上缓解手机的卡顿问题。

相反的,都0202年了,苹果的内存却还是只有3-4GB。这是源于苹果对自己平台上的应用有著绝对的管辖权,你清理后台,app说关就关,不会有残余的进程在后台运行。更不会有相互唤醒等骚操作。

那苹果是如何解决消息接收的问题呢?

苹果有个自己的伺服器,比如微信的消息,对方的消息先传送到微信伺服器,然后微信伺服器在传送到苹果伺服器,苹果伺服器再将消息送至用户手机上,提醒用户某个app有新的消息。

—————————

很多小伙伴提到统一推送联盟,这个也许能解决一部分问题,但作用仅限于那些自觉的app厂商。我前面也提到了,消息接收进程其实占不了多大内存的,真正的内存大户是app的自启动和相互唤醒,否则那些动辄好几亿的日活跃用户是哪来的。

还有小伙伴说等咱们自研一套规范化系统,严格监管所有app的活动,比如某为的鸿蒙,但这个操作难度也很大,如果一个新生的规范化系统强制所有上架app接受监管,那各大app厂商有没有可能为了利益联合起来抵制新生系统呢?将其扼杀在摇篮里。对于资本家而言,断人财路如同杀人父母,在利益面前,他们是可以不顾一切的。也许国产系统会有zf的支持,但是这些个大公司怎么可能没点手段呢。

苹果之所以可以这么搞是因为人家从开始之初,整个行业刚刚起步的时候率先制定了游戏规则。那个时候app开发者的声音还很弱小,但是如今早已今时不同往日了。


为什么,说不清楚,但就是感觉安卓非常消耗内存。

我的手机也是6GB 运行内存,后台一个知乎,一个微信,一个TIM,一个终端,一个网易云音乐,显示可用2.4GB,但

实际剩余83MB RAM+960M swap!!但657个进程,比我用过的所有Linux系统在不进行编译的时候都高!

还有那个PID 1309 System_Server过分了啊,我才6GB RAM你却申请了10GB!

PID 11918 Theme,主题服务也申请了7.9GB空间!

PS:VIRT不表示实际占用,假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量!剩余未占空间,其他程序可占用!RES-(常驻内存)SHR(共享内存)才是程序真实占用的内存!


其实真的不必在意这些被用掉的运行内存,Windows也是这样的机制,当你的内存空闲的时候,它就会做一些有用的事情;当用户需要的时候,那些服务就被系统关闭。

况且安卓也有虚拟内存,内存不够的时候就会将一部分数据转移到硬碟上。现在的硬碟都是UFS的,比前几年EMMC快多了,速度快很多,一般不会再卡了。

注:这里的虚拟内存机制好像解释的有点不对,正确的虚拟内存机制可以看评论区我给 @Vigilance 的回复

在一些软体开始崩溃,或者系统开始变慢的时候,通常我们都会看看运行内存使用情况。监控内存使用状况是很重要的,Android上的所有东西包括系统都占用了有限的运行内存。


目录

1.什么是内存?

2.为什么越多的「空闲」内存反而不好?

3.为什么安卓系统要用这么多内存?

3.我该如何避免内存不足的情况?

4.iOS和Andriod的内存机制差异

5.我们究竟需要多大内存的手机?

6.总结


内存是什么?

内存是一种易失性数字存储器。主要使用内存来保存活动的应用程序以及CPU和操作系统内核使用的数据。内存在读写方面非常快,即使是最快的硬碟或快闪记忆体,对于CPU来说,当你需要「现在」读或写一些东西时也会很慢。虽然手机内的CPU有自己的高速缓存来存储用于计算的数据,但它并不多。即使是最新的骁龙处理器的缓存也只够保存当前正在使用的内容,因此您需要有地方保存下一步正在使用的内容。

如果把硬碟比作一个大仓库的话,那么内存就是商店,CPU就是顾客,CPU缓存就是顾客的手和袋子。卖东西总不能在一个偌大的仓库中寻找吧?那顾客得要急死。为了跟上顾客的速度,就必须要有内存来为货物进行缓存。

在使用手机硬体时,安卓充当了一个交通警察。当一个游戏或任何应用程序想要绘制一个新的屏幕时:数据被创建-&>保存在内存中-&>操作系统内核对其进行解析,让CPU和GPU做任何需要的处理-&>发送到显示器上,这样就可以在正确的地方绘制出正确的屏幕。

这听起来很复杂,其实也很复杂。但你只需要了解三件基本的事情:内存是一个存放数据的地方,放在那里的数据可以很快读写,当你关机时,内存中的数据会被擦除。此外,手机内存的一部分会在你开机后立即使用,没有应用程序甚至操作系统能够使用该部分。这几乎适用于任何一台计算机;它们(几乎)都有RAM,而且使用方式相同。


为什么越多的「空闲」内存反而不好?

Android的设计方式是有效地利用任何可用的运行内存,所以如果你看到你的系统占用了超过50%的运行内存因此如果运行有空闲内存,Android就会介入,让运行内存做一些有用的事情。而这个阈值就是你内存的一半。

如果运行内存还没有运行任何用户应用程序,内存只占用到一半,这恰恰说明了资源被浪费了。然而,如果你需要更多的运行内存用于你的应用程序,一些系统程序都将被暂停或转移到虚拟内存中,以提供你所需要的运行内存。同时,这也是为什么你不必使用任务管理器的原因

毫不掩饰的说,即使是再大的内存,20G也好,在理想情况下也会占用掉一半。再加上一堆流氓软体、后台接收线程,可能只剩下8G了......

你唯一需要担心的是内存使用过多的时候、其他应用程序开始崩溃的时候,这些情况我稍后会介绍。


为什么安卓系统要用这么多内存?

为了确保Android的顺利运行,Android操作系统会占用大量的运行内存来做很多事情。这些事情包括存储即将使用的信息、优化流程,以及确保一些任务不会搞砸的服务。

如果你有空闲的内存,你的操作系统通常会把做任何它能做的事情,使你的整个体验更顺利。这就是为什么你有时会看到它占用了大量的空间。

尽管如此,仍然有一些内存垃圾会减慢体验速度,比如说小破乎天天给你推荐一大坨乱七八糟的东西,还有一大堆软体自启动和相互唤醒。在国外,拥有GMS服务的安卓手机和苹果的信息都是从一个伺服器统一接收的,这样就可以占用尽可能少的内存。但在国内......这也是为什么小米、vivo、OPPO要联合成立「统一推送联盟」的原因了。

这里引用一张知友的图片:

后台接收信息线程占了绝大多数内存,附赠一大堆流氓软体

微信唤醒QQ,关掉微信,QQ唤醒微信,关掉QQ,微信唤醒QQ,再关掉微信,QQ又唤醒微信......(递归) 禁 止 套 娃

它们是可以在在自启动里关掉的。

你也可以自己看一下手机里有哪些垃圾服务,然后自己关闭其自启动:

https://jingyan.baidu.com/article/acf728fd8de25bf8e510a3ce.html?

jingyan.baidu.com

操作系统占用的内存一般是下面几种,看看就好:

内核空间:你的Android手机运行在Linux内核之上。内核存储在一种特殊类型的压缩文件中,在设备开机过程中直接提取到RAM中。这个保留内存保存内核、驱动程序和内核模块,这些模块控制硬体和空间,以便在内核内外缓存数据。

虚拟内存:系统树中有一些文件夹和文件不是「真实的」,它们是在启动时编写的伪文件,保存著电池电量和CPU速度数据等。对于Android,整个/proc目录就是这些伪文件系统之一。

后台接收信息线程:有关IMEI和收音机设置的数据存储在NVRAM中(非易失性存储器,当您关闭手机时不会擦除),但在您第一次打开手机时,会与支持数据机所需的软体一起传输到RAM。我们预留了空间来保存这些信息。

GPU:手机中的图形适配器需要内存才能工作。这叫做VRAM,我们的手机使用集成gpu,没有独立的VRAM。为此保留了系统RAM。


我该如何避免内存不足的情况?

虽然我说过内存里没有空闲是一件好事,但是仍然会出现这样的情况:根本没有足够的内存,这取决于一次运行了多少个进程。这要么意味著应用程序和服务将崩溃,运行速度将比正常情况慢得多,要么根本无法启动一些应用程序。

当你用完了一个应用程序,并确定你不会再在短时间内使用它,请确保关闭它。如果你没有清理掉它,这个应用程序仍然会在后台运行,同时等待再一次运行。如果你的Android需要内存,它会尽可能地使用它,甚至停止保留某些服务。

还有就是可以在关闭自启动里关掉你不需要后台接收信息的程序。

这里以小米为例:

1、首先,点击手机【设置】,进入设置页面

2、在设置界面,点击【授权管理】3、进入授权管理界面后,点击【自启动管理】4、在跳转的页面,滑动找到需要关闭自启动的软体

5、点击关闭右端按钮,关闭软体自启动

还有就是要养成一个习惯,当你完成某件事时就把它的那个应用程序关闭,那么你就不需要到处杀掉任务来让一切运行得更顺利。


iOS和Andriod的内存机制差异

在大多数比较中,你会发现iPhone的操作系统比Android操作系统占用的内存要少得多,但这是因为这两个系统处理各自任务的方式不同。即使不涉及内存,两个手机操作系统之间的其他数据也是如此。

一般来说,Android会比iPhone使用更多的运行内存,因为它们在后台执行更多的进程来优化或载入更多的体验。你可能会在iPhone上得到更多的运行内存「空闲」,但这只是空间,并没有充分发挥其潜力

其实在国外,原生安卓跟苹果占用的内存是差不多的。

记住,没有使用的内存在Android上可能会浪费空间。这并不意味著你应该打开尽可能多的进程,但如果你只看到几百兆的内存可用,你也不必担心。

说真的,Android的优化已经越来越好了......


我们究竟需要多大内存的手机?

对于一个普通的Android手机来说,10GB或12GB的内存是完全足够的。像国外Android One/Android Go这样的手机在开机后仅仅使用1.5-2GB的内存。

根据这一点,我们可以看到,一部需要在后台运行更多程序的手机需要安装更多的内存。因为现在几乎每部手机都有6GB的内存,所以这里没有什么区别,一部智能手机只需要多一点内存,就可以运行另外一两个应用程序,因为它的操作系统用得不多。这也是为什么三星、LG、HTC和其他公司在需要稍微提高性能的时候,会采用一些方法来终止正在运行的进程。如果你删除所有你能删除的应用程序,那些不在内存中的应用程序会启动得更快一些。

当然,电竞玩家、想用手机修图和其他特殊用途除外。


结论

Android的操作系统充分利用了你有多少可用的内存,以及它同时需要多少内存来实现基本功能。内存不足会使应用程序运行缓慢,导致手机运行缓慢,或者迫使它们关闭,但你的操作系统并没有错。只要你在完成一个应用程序后关闭它,你的安卓系统就会处理剩下的事情。

对于一款手机来说,6G足够了,10G以上绰绰有余。


又有大佬来了:

【内存就是拿来用的】

这是因果搞反了!因为它吃内存,所以才不得不配 大内存、越来越大的内存;而不是内存 无意中 买大了,能完全利用 才不浪费。

我讽刺的是看著什么也没开,内存占用了一半心慌慌的人【笑】

同样缓存n个应用。

如果A系统只需要3G就够了,B系统6/8/12G都有多少用多少,难道不是B系统及其应用机制烂:浪费内存?

缓存下 的意思是切换应用时,不会有应用需要重新运行(显示广告,手工或自动回到刚刚的内容)

常用的QQ、微信、知乎、微博,按理说,3G内存就完全足够缓存了,现在是6G内存下切换一圈,还是会有应用需要重新运行!

嗯,我说的是有一堆流氓软体。

不过苹果的其实是运用了冻结机制。

安卓系统下,后台运行 APP 会占用一定的资源,加快电量流失。但 iOS 的后台机制则不一样,对后台 APP 的管控十分严格。iOS系统中,App的状态可以分为5个,分别是Not Running、Active、Inactive、Background和Suspended。

第一个状态Not Running:App没有启动,也没有后台运行第二个状态Active:用户正在使用App,比如说我们聊微信看网页的时候,App就处于Active状态。第三个状态Inactive:这是一个过渡的状态,App虽然打开了,但是用户没有跟App有任何互动操作。第四个状态Background:App在后台运行,微信会在没有打开的时候接收消息。第五个状态Suspended:App虽然在后台运行,但是处于休眠状态,只占用一点内存。

所以才会不一样。确实是机制烂的问题,不过比一开始安卓好很多了。

所以我推荐安卓手机8G/12G内存

苹果4G就足够了


感谢评论区大佬 @Zip0123 的建议!

真的很感谢各位评论区大大提出的建议!

码字不易,给个赞吧!


开一个软体关联启动一堆,然后后台还清理不干净。root许可权后清理后台可以多出很大一部分

你看一个QQ浏览器,我看一下天气预报,他甚至企图把腾讯全家桶都打开。


作为一个多年安卓平台程序员, 发自肺腑的一句话....

安卓就tm是个垃圾!

给这个平台开发程序就是折寿, 很多小问题, 在别的平台都不是事, 到了安卓....呵呵.折腾你好几天吃不下饭.

到处都是许可权, 这个不允许,那个不让弄. 这不允许访问.那里不让读取.

最关键的是 .许可权机制异常繁琐, 效率低下.内存占用还大!

我们公司开发相机app. 也就占用几十兆内存, 但有一次接了个低端机项目, 内存1G的. 一拍照系统说没内存. 崩掉了.

你说著急不著急. 处理图片能消耗多大内存?

4160x3120的rgb图片. 各种边边角角都算上.你给我开200M内存我开心的要死.

但是你1G内存. 连给前台APP分配 200M内存都无法保证. 你个垃圾安卓还有啥理由说自己是是个新时代的智能系统?

很多人说,安卓 不输 苹果! 流畅度刚刚地. 我呸! 你刚买的新手机当然这样了. 等你微信,微博.qq 等常用软体装一堆试试? 你一个智能操作系统连限制后台cpu占用率的一篮子解决方案都没有?那你整天安卓 5,6,7,8,9,10 更新了个屁?

还有, 我们公司是做软体内置的. 有时和客户商量好, 一台机器给多少钱(按台收费),那我们就要按照每台的唯一识别号收费吧? 可是安卓个垃圾说是要服从欧洲的什么XX法律. 导致我们app里因为许可权问题得到的android-id(设备识别号)是错的!

也就是说,如果客户不地道,在rom里面动手脚,修改一下核心代码, 那么在app层,你读出的cpu-id, android-id, 甚至别的mac号什么的. 可能都是一堆000000000.

好,你提供错的我们也忍了. 因为毕竟是内置软体.我们可以修改rom嘛 , 我们把部分代码拆分到ROM层(内行话叫HAL层或者framework层)里面, 我在ROM层获得android-id再传给app行了吧?

安卓这贱人淫笑著说: 不行!

事实上你数据也确实传不出去. 因为安卓有文件系统许可权隔离, ROM层写到sd卡上的文件 ,app里看不到. app写的文件你在ROM层里也找不著..就是这么贱. 双方无法通信.彼此看不到对方.好像是平行世界.

(但是最后许可权总能拿到, 因为不给许可权我们的相机就拒绝运行,手机厂商不答应就别用呗, 反正你给的钱又不多,我们公司虽然也快饿死了但也不缺这几个瓜子, 最终客户依然会妥协, 我们要啥许可权给啥, 但项目一开始许可权没给就会导致折腾, 反复的交涉很烦.)

有的程序员看了会说: 那你们可以通过增加介面,打洞的方式,让app层问system层要数据呀?不就是加几个函数介面的事吗?

说是说的简单啊 ,但是这牵扯到要改至少几十个文件,每次修改好然后调试.你都要战战兢兢地把修改后的代码上传到编版本的机器上make一遍. 不报错后,然后关手机,刷机.再开机.测试. 一轮下来至少半小时.

你说为了传十几个byte,折腾到半夜值吗?老板又没有每个月给我发个5万8万的,觉得值你来搞?我反正到了18点就要下班,先吃一碗12元的不加肉拉面,然后去路口洗脚店里抱小妹去. 你慢慢加班替我做如何?

回头想想,程序员的时间真的是不值钱. 上游的一帮装逼狂+混球程序员设置各种障碍, 然后让下游的另一帮程序员天天浪费时间,疯狂加班研究怎么绕路怎么迂回.

你说我只要不是个智障, 我为啥会去给那帮上游挖坑的程序员叫好?去赞美他们弄出来那一堆该死的许可权系统?

一直到我写这个答案的今天. 每次移植我们的相机项目,都要掉一把头发. 各种因为许可权的问题都要折腾好几个来回. FAE(负责跑到厂家那边移植的工程师)也累个半死. 我的代码里只想简单滴保存一个小文件, fopen("xxxx.txt","wb") 一下, 结果给我报告失败.说我没许可权....

而你又不能每次都联网测试版权. 因为你的手机可能会卖到非洲, 碰巧有一天一个大老黑在草原上想用安卓手机, 拍摄一场百年不遇的 彭彭和丁满互相打飞机的好戏. 你不能说现场没网路而不让客户拍摄是吧?

所以一般用户,你们真别抱怨什么6GB内存少了一半的问题了. 给你留下20%就不错啦.毕竟这个安卓系统,一开始就是给一帮小学生搞机器人比赛用的.


这是我们最近正在做的项目,警察叔叔执法记录仪,采用展讯超级便宜的cpu.屏幕解析度320x240,超级卡.卡的你阳痿:

在这个项目的开发过程中, 我们真的是踩遍了安卓挖下的坑, 很多说起来很简单的小功能, 等你真的实现起来.会发现蛋疼无比..我举个栗子:

客户说屏幕虽小也要让我能够输入文字. 于是我们给他加了安卓自带的26字母键盘输入法. 可是...这个屏幕就5厘米宽.大粗手指想在屏幕上点击26字母键盘就是做梦啊.于是让我们给找个合适的九宫格输入法.可市面上根本没有支持320x240的输入法可用.

于是客户说:要不你们开发个吧,给你们500大洋...

所以我现在转包一下.谁自告奋勇开发个,或者能提供个 能适配320x240屏幕的输入法.我给600!


再多啰嗦两句,现在国内手机市场都被华为,小米,OV等几个大厂家占据了.小手机厂利润很少.也就出口卖给印度阿三,非洲老黑 这种档次的客户.出货量也没多少.口袋里也没多少钱. 但是他们的需求却一点也不少, 比如内置相机. 什么滤镜,美颜,瘦脸,磨皮,双摄模糊,全景图,广角...乱七八糟的花里胡哨的效果都想要. 但又出不起钱.

晶元厂商那头, 台湾MTK,大陆的展讯科技(现在好像改名成紫光展锐)也在裁员+裁剪功能, 前几年你买他们的晶元,他们送美颜代码, 据说展讯最多时候养了二百多号人专门做相机这部分功能.

但是这两年,消费不振,经济萎靡, mtk等厂家大把裁人,美颜代码也不送了. 直接对这帮穿补丁衣裳的小厂说: 要美颜,滤镜? 出门左转找那家XXX,他们有!以后不送了!

于是我们公司就有了一点点小生意. 但是对我们从业者来说, 目前最大的矛盾,就是 [客户越来越多的功能需求] 和 [安卓这垃圾系统上做什么功能都费劲 + 穷逼客户出不起开发费 ] 之间的矛盾.

(评论里有人质疑,说安卓本来就不适合做执法仪, 有很多什么别的操作系统可以用, 但是客户选了半天,还是安卓成本最低啊,程序员最好找, 你换个冷门的OS, 那程序员开口要工资一个月4万你给是不给呢?还有你选择的摄像头等模组,人家有现成的安卓驱动,你选个别的OS,驱动谁来写?再花几十万雇一堆人? 所以最后还是成本问题.)

比如著名的相机演算法提供商,虹软科技(arcsoft),你要去问他们能不能提供一套双摄伪单反演算法(也就是抄苹果双摄那个能把照片里人拍的清楚,背景弄模糊的演算法),人家开口就是一千万.

小厂听了直接吓尿. 只能找我们, 但是我们也不是活菩萨. 也有十几号人要养活啊.问他们接受什么价..小厂伸出5个手指...

哎..你说安卓这个平台还有啥希望啊, 我还是晚上多学学unity吧. bilibili上教程很多, 先把ps, 3dmax+maya ,shader 都精进一些. 这些软体技术我觉得还是比较保值的. 后面转 偏技术的技术美术. 我觉得路还宽点.

至于安卓那一套框架,机制.文档, 爷没空研究了. 就是垃圾!


推荐阅读:
相关文章