因為很多進程你是無法通過清理後臺關閉掉的,比如你清理完後臺,你的微信,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 都精進一些. 這些軟體技術我覺得還是比較保值的. 後面轉 偏技術的技術美術. 我覺得路還寬點.

至於安卓那一套框架,機制.文檔, 爺沒空研究了. 就是垃圾!


推薦閱讀:
相關文章