為什麼同樣是2G內存,windows可以同時運行的程序數量遠大於安卓(以不重載為前提)?安卓可以改善這一點么?
就比如小米平板,2G內存,運行爐石傳說,切出來就發現桌面重載了,切回去遊戲重載了。而同樣2G內存的windows平板,不僅切出來沒問題,開更多程序也沒問題。安卓是故意如此嗎?還是有其他原因??
這樣,你試試把電腦的虛擬內存調小,使勁調小(要是可以最好關了),然後再用用看看,對,應用不會被殺進程,到時候說不定直接死給你看。
移動操作系統和桌面操作系統不一樣,移動操作系統的那些app沒那麼重要,並且一開始就為了應對被終止設計了各種保存策略,但是桌面操作系統在內存不足時不是靠自動清除後台進程,而是靠把一部分不活躍內存放進虛擬內存裡面。要是虛擬內存都滿了,有的應用會被直接殺死。題主你問的這個問題沒有意義,安卓不需要在移動平台向Windows學習這麼做(因為你說的那些英勇大多不是基於.Net或者Java的),反之Windows也不需要在桌面環境上向移動平台學習——Modern APP除外。
沒有交換分區(SWAP,Windows上的頁面文件)是一個原因,但也不僅僅是SWAP導致的。
安卓內核是Linux,可以試著在Linux里把SWAP關掉,同樣的2G內存,Linux能做的事情也比安卓多一些。
我能想到的原因有以下幾點:
安卓的應用大多數都是Java寫的,JVM是一個內存大戶,手機QQ就是一個例子,手機QQ有時候耗的內存跟PC的內存相當,但功能上少太多了。如果用Native Code去編寫應用,內存應該會省很多。
話說,就算是在PC上,Java也是很吃內存的。
沒SWAP是一個大問題,並且對於Linux這種宏內核的操作系統來說,沒SWAP是很致命的,Windows可以通過配置(甚至可以通過改註冊表)減少服務和驅動的載入,來控制整個內核空間運行時佔用的內存大小,但宏內核的Linux要做到這一點就很麻煩,剪裁內核對於安卓來說是不太可能了,Windows通過改服務就可以,甚至360就可以做到這點。所以同樣是關SWAP,對Windows和Linux的殺傷效果是不同的。
還有一個功能,我不清楚安卓是否能實現(具體的說,是JVM是否實現),但Windows肯定實現的就是可執行文件映射,我猜Linux肯定支持,但放到JVM里就不好說了:
即使在關閉頁面文件的情況下,可執行文件也不一定是一次完整的載入到內存的,Windows的緩存管理器(CcManager?好像是這個東西)仍然可以對EXE以及一些資源做不完全載入。所以,哪怕是一個10MB的應用,運行時也未必是10M都載入進去(以及包括各種文件資源等)。Linux應該是支持的,但放到JVM App里就難說這種技術的效果怎樣。
以上幾條同時存在,導致安卓內存使用效率偏低。
安卓不開SWAP的原因有很多,據說一條是因為Flash太慢,如果用戶裝了一個class 4的tf卡的話,SWAP會慢的要死(其實SWAP也可以做到內置ROM里的)。
如果要在手機上獲得PC一樣的效果,只要解決這三個問題:開SWAP,用native code(彙編)寫應用即可(開SWAP以後內核的結構影響已經不大)。
另外請注意,題主問的是運行的任務的個數,而不是運行任務的速度,所以SWAP是主因,JVM不是。我曾經用過一個特別古老的安卓手機摩托ME500:【摩托羅拉ME600參數】MOTO ME600手機參數,256M內存,安卓1.5,這個手機如果應用裝多了的話,經常會被自動殺死,比如QQ、鬧鐘被幹掉都是正常事,後來刷機到安卓2.x,開了交換分區,雖然還很慢,但最多就是卡,而不是任務被幹掉。
但我相信廠商是故意的,因為這樣可以賣高配機型,2G內存和1G內存價格上差的,恐怕不只是1G內存的價錢。安卓一般情況下是不開虛擬內存的。
windows單就系統的完全內存佔用就可以達到3-4G, 只是一般情況下都會根據用戶的內存大小,將一些次優先順序的程序或者系統文件放在虛擬內存里。你試試在電腦上用Eclipse開個安卓虛擬機,估計電腦直接死在你面前。
swap不是根本原因,只是增加了總可用內存而已。Windows上跑個爐石和桌面大概即使關了虛擬內存也撐得住(不過如果開著的話一定是會用的,和Windows的swap策慮有關)。就是JVM的overhead以及大量粗放的Java程序導致的內存不足,配合安卓的OOM策略導致的結果。
安卓每個app的內存佔用的確相對大一些,和Java本身特性有關,也和Java門檻低、很多程序員幾乎不考慮資源佔用、或者寫GC不友好的程序有關。
另外,安卓這樣的移動系統,首要目標是保證前台程序順暢、有餘量(沒有swap,內存真滿了就麻煩了),所以有不一樣的OOM機制。不是原生Linux的OOM Killer了,而是Low memory killer。
1G內存無swap的虛擬機里,跑個vanilla Linux帶個XFCE什麼的輕輕鬆鬆,可以跑一堆東西呢。
改善的辦法肯定有,但沒有什麼市場驅動力。而且在眾多改善辦法里,支持64位、邁入4G內存時代無疑是最熱門的……硬體廠商也高興……
------------
補充一下:雖然我說swap影響不那麼大,主要是內存的確不足+OOM策略導致。但的確,加swap的確可以「解決」這個問題,甚至即使是壓縮內存然後虛擬出一個swap,也能解決問題。為什麼呢?總內存增加了。不那麼容易OOM了。然而,Linux內核在有大量內存的情況下不會積極把空閑頁面swap出去。加swap並不是結構性地解決了問題,而是解決了癥狀。同理,如果調節安卓Low memory killer的策略,讓其不到萬不得已不殺進程,也能增加同時運行的進程數量,但有一定概率真的OOM,導致卡頓或者不可預期行為。只要你想,安卓也可以有swap的
拋開CPU和硬碟只談內存都是耍流氓,還有,內存速度你也沒有談啊。
安卓應用都是基於JAVA的,一個進程一個JAVA虛擬機,那傢伙比WINDOWS下的C++程序耗內存多了。
拿桌面系統和移動系統比有點不厚道啊。
安卓確實不如Windows,但沒什麼奇怪的。
畢竟一個三十年的東西,一個不到十年。
除了java占內存,沒別的原因。
推薦閱讀:
※計算機怎麼知道用戶態和內核態?
※Win 向Mac遷移的用戶,那些建議可以幫助新用戶更好地適應OS X?
※在 Windows 普遍的大學 Mac 各種不方便要怎麼破?
※操作系統多進程多線程的相關問題?
※在可見的將來,我們能看到國產操作系統崛起嗎?
TAG:MicrosoftWindows | 操作系統 | Android |