Android 操作系統為什麼不啟用swap?

如今(2017)Android智能手機的存儲空間(64GB+)和讀寫速度(UFS2.0+)都已經相當可觀,那為何不啟用swap來增加內存的可用空間呢?


swap會對某一特定flash區塊頻繁擦寫,這對flash壽命影響過大。為了減少故障率,所以不啟用swap。

速度什麼都都是小事。

另外,普通文件也可以作為swap交換文件,不依賴於單獨分區。

zram與swap是兩種不同的技術,zram是用CPU時間換內存空間,swap是用io時間換內存空間。兩者取捨不同。一個降低CPU運算效率,一個降低io速度。


弱弱的答一發。

Android是基於Linux的,但是在內存策略上有自己的套路。

先區別一下兩者的不同:

Linux是一種「進程內存最大化」的分配策略,每個進程拿著OS分配給自己的虛擬內存,彷彿自己佔滿了整個地址匯流排的用戶態空間。而這樣就自然需要Swap機制來保證物理內存不被消耗殆盡,把最近最少使用的空間騰到外部存儲空間上,假裝還是存儲在RAM里。

但是Android的的進程分配策略是每個進程都有一個內存佔用限制,這個具體大小由手機具體配置決定。目的就是為了讓更多的進程都保留在RAM中,這樣每個進程被喚起的時候可以避免外部存儲到內部存儲的數據讀寫而造成的啟動卡頓,加快更多的App被點開時候的響應速度,所以這是為什麼Android不採用「進程內存最大化」的分配策略的原因,一個流氓App把所有的內存全搶了,豈不是手機卡成狗。隨之而然,Android採用了自己的LowMemoryKill策略來控制RAM中的進程。

所以目的相同,都是希望物理內存的利用最大化,只不過兩者採用不同的策略,一個是Swap,一個是LowMemoryKill。

比較一下Swap和LowMemoryKill的區別:

Swap通過將最不頻繁使用的進程數據寫入磁碟,來給物理內存騰出空間。

LowMemoryKill通過給進程分等級,來選擇級別最低去殺死來騰出物理內存空間。Android系統會考慮進程的回收利益,當Android系統開始殺死LRU緩存中的進程時,系統會判斷每個進程殺死後帶來的回收收益。因為Android總是傾向於殺死一個能回收更多內存的進程,從而可以殺死更少的進程,來獲取更多的內存。殺死的進程越少,對用戶體驗的影響就越小。

相比較而言,LowMemoryKill這種策略更符合手機OS的用戶體驗需求。

再者。你說UFS2.0+的讀寫速度相當可觀,可那畢竟也是外部存儲設備,就目前而言和RAM的讀寫速度相比還是慢太多。並且也沒有那種系統架構可以直接讓CPU和外部存儲的數據交互,所以它再快,也還是一種外部存儲設備而已。

有誤望指出!

參考:談談Android的內存管理機制


其實還是有很多廠家默認開了zram

比如Flyme

當然具體的作用的話。。。感覺並不明顯。。。


swap在內存如此廉價的今天已經過時了,伺服器很多都不用swap。swap容易造成顛簸,是不穩定的來源。伺服器變慢比拒絕服務更加可怕,而且有可能引起連鎖反應。

對於手機,可以關閉後台程序,這個比用swap來保留後台程序導致前台程序變慢更加不能忍受。


先問是不是。

htc Dream Android 3.0 蜂巢默認開啟SWAP,調用MTP /data/分區裡面大約16M的容量當作SWAP(有一個swapfile文件),而htc Magic 32B版本的Android 3.0也是一樣。iPhone在早期也可以通過越獄開啟交換區,這都是早期設備運行內存不夠大導致的。

除此之外,沒默認開啟swap的設備都可以通過使用swapper這個軟體開啟swap,目前大多數手機都默認打開了內存交換區功能的。

後來處理器性能夠強大了,就有了內存壓縮技術。但是這個東西會影響性能。

現在內存容量夠了,就沒必要搞什麼SWAP和內存壓縮技術了,簡直就是性能殺手。


我看到了 那麼多人回答 然後我就想知道 你是怎麼知道 Android 沒有虛擬內存的。可不可以具體說明一下。我依稀的記得我的小米手機 Linux上面 是有虛擬內存的 只不過JAVA虛擬機沒有用這一部分內存而已。如果我沒有記錯的話。明天拿出證據今天太晚了

這裡明顯可以看到 是有虛擬內存的好不


記得mb525有一個第三方rom,樂蛙,有一版就開了32M的swap,手機流暢的不像話

再補充下,moto的E8原本的rom卡成屎,ilove3d有個包一開swap就流暢很多,只不過增加了耗電。當然E8不是安卓。在智能手機早期開swap是很常見的事。

至於對壽命的影響,mb525至今能正常工作。


手機內存都4G以上了,為啥要用虛擬內存?虛擬內存真用上,卡得一筆


這個官網上都有答案了,自己Google翻譯下。你在nand flash 上開swap頻繁寫入??


手機存儲基本都是固態的,啟用swap簡直是暴殄天物


你可以自己使用相關工具手動開啟(需要 root)

安卓系統和應用的內存佔用普遍都比 PC 高,可能導致比 PC 上的 Linux 更加頻繁的內存交換。還有安卓的進程回收策略是區別於 Linux 的,每一個應用前後台進程都有在內存緊缺時釋放的優先順序,使用 swap 可能破壞這種回收機制,導致大量進程不回收從而讓手機更加卡。


我覺得加大內存和採用墓碑機制更可行。

只不過,國產毒瘤們加全家桶有多少內存都不夠,都不夠。

so,我把非必須的軟體全卸載了,即使所有軟體全開內存也都裝的下

(最後再設置禁止所有軟體後台運行)

——————

swap明顯不適合手機,在ubuntu上,除了播放器,虛擬機/wine skype,其他軟體都自覺的緩存,安卓上的APP可能么?

哎,如果安卓一開始就是原生的linux發行版,現在也不會有這麼多的問題,哪還需要什麼6g內存,8核處理器..


安卓手機自身是沒有swap盤的,但是可以通過ROOT後用特別的軟體開啟。安卓的內存回收機制oom,為進程進行分級,將不常用,沒有活動,服務,廣播的進程殺死,保證內存可以維持在一定的水平。

安卓自身有JAVA虛擬機,通過設置虛擬機堆棧來控制應用最大內存使用量。

後台機制和LINUX完全不同,所以沒有swap。實際上安卓的ZRAM技術和swap是相似的,只不過存儲的壓縮進程還是在RAM中,不放置在外置存儲器。


推薦閱讀:

大部分安卓手機真的都能升級android 8.0嗎?
如何最有效的解決Google公共庫&字體庫被屏蔽的問題?
為什麼更改主機host可以訪問google?
如何評價Schaft最新發布的雙足機器人?

TAG:編程 | Linux | Android開發 | 谷歌Google | Android |