安卓的記憶體管理機制

2021-03-04 03:59:27 字數 3383 閱讀 3794

1.系統會對程序的重要性進行評估,並將重要性以「oom_adj」這個數值表示出來,

賦予各個程序;(系統會根據「oom_adj」來判斷需要結束哪些程序,一般來說,「oom_adj」的值越大,該程序被系統選中終止的可能就越高)

2.前台程式的「oom_adj」值為0,這意味著它不會被系統終止,

一旦它不可訪問後,會獲得個更高的「oom_adj」,我們推測「oom_adj」的值是根據軟體在lru列表中的位置所決定的;

3.android不同於linux,有一套自己獨特的程序管理模組,這個模組有更強的可定製性,

可根據「oom_adj」值的範圍來決定程序管理策略,比如可以設定「當記憶體小於x時,結束「oom_adj」大於y的程序」。這給了程序管理指令碼的編寫以更多的選擇。

android將程序分為六大類:

1.前台程序(foreground):目前正在螢幕上顯示的程序和一些系統程序。

舉例來說,dialer storage,google search等系統程序就是前台程序;

再舉例來說,當你執行乙個程式,如瀏覽器,當瀏覽器介面在前台顯示時,瀏覽器屬於前台程序(foreground)

但一旦你按home回到主介面,瀏覽器就變成了後台程式(background)。我們最不希望終止的程序就是前台程序。

2.可見程序(visible):可見程序是一些不再前台,但使用者依然可見的程序,

舉個例來說:widget、輸入法等,都屬於visible。

這部分程序雖然不在前台,但與我們的使用也密切相關,

我們也不希望它們被終止(你肯定不希望時鐘、天氣,新聞等widget被終止,那它們將無法同步,你也不希望輸入法被終止,否則你每次輸入時都需要重新啟動輸入法)

3.次要服務(secondary server):目前正在執行的一些服務(主要服務,如撥號等,是不可能被程序管理終止的,故這裡只談次要服務),

舉例來說:谷歌企業套件,gmail內部儲存,聯絡人內部儲存等。

這部分服務雖然屬於次要服務,但很一些系統功能依然息息相關,我們時常需要用到它們,所以也太希望他們被終止

4.後台程序(hidden):雖然作者用了hidden這個詞,但實際即是後台程序(background)

就是我們通常意義上理解的啟動後被切換到後台的程序,如瀏覽器,閱讀器等。

當程式顯示在螢幕上時,他所執行的程序即為前台程序(foreground),

一旦我們按home返回主介面(注意是按home,不是按back),程式就駐留在後台,成為後台程序(background)。

後台程序的管理策略有多種:有較為積極的方式,一旦程式到達後台立即終止,這種方式會提高程式的執行速度,但無法加速程式的再次啟動;

也有較消極的方式,盡可能多的保留後台程式,雖然可能會影響到單個程式的執行速度,但在再次啟動已啟動的程式時,速度會有所提公升。

這裡就需要使用者根據自己的使用習慣找到乙個平衡點

5.內容**節點(content provider):沒有程式實體,進提供內容供別的程式去用的,比如日曆**節點,郵件**節點等。在終止程序時,這類程式應該有較高的優先權

6.空程序(empty):沒有任何東西在內執行的程序,有些程式,比如bte,在程式退出後,

依然會在程序中駐留乙個空程序,這個程序裡沒有任何資料在執行,作用往往是提高該程式下次的啟動速度或者記錄程式的一些歷史資訊。這部分程序無疑是應該最先終止的。

對於一些記憶體很低的低端android機而言,系統預設的記憶體分配機制無法實現很完善的記憶體調配。所以在執行大型遊戲時需要先清理一下記憶體。

有人說後台掛著程式很費電,事實上android的應用在被切換到後台時,它其實已經被暫停了,並不會消耗cpu資源,只保留了執行狀態。至於**、****之類的程式可以在後台執行,是因為這些程式在後台開啟了服務,而服務可以後台執行,所以沒有帶服務的應用在後台是完全不耗電的,沒有必要關閉。這種設計本來就是乙個非常好的設計,下次啟動程式時,會更快,因為不需要讀取介面資源。

android系統這樣的設計不僅非常適合移動終端的需要,而且減少了系統崩潰的可能,確保了系統的穩定性。老想著清理記憶體的同學完全是因為被塞班或者windows毒害太深,事實上,經常用taskiller之類的軟體關閉後台所有程序,很容易造成系統的不穩定。很多時候出現問題,只要重啟就能解決,其原因也在於此。

android 是如何管理程序的

在android裡,程序和程式是兩回事,程式可以一直保留在系統裡,但是沒有任何程序在後台「執行」,也不消耗任何系統資源。所有的程式保留在記憶體中,所有可以更快的啟動回到它之前的狀態。當你的記憶體用完了,系統會自動幫你殺掉你不用的任務。

需要明白的是,android用ram的方式,跟windows啥的是兩回事。在android的世界裡面,ram被用滿了是件'好'事。它意味著你可以快速開啟之前開啟的軟體,回到之前的位置。

所以android很有效的使用ram,很多使用者看到他們的ram滿了,就認為拖慢了他們的**。而實際上,是你的cpu——當你的軟體真正執行時用到的東東——才是拖慢手機的瓶頸。

為啥說程序管理軟體是禍害

很流行的各種程序管理軟體都說幫你釋放記憶體是件好事,但這是不正確的。開啟這些軟體時,他們告訴你「執行」的軟體和殺死他們的方法。你也可以在「服務」裡面看到到底程式的哪些部分在「執行」,占用了多少記憶體,剩餘多少記憶體。

所有的這些都告訴你,殺掉這些程式能夠釋放記憶體。但是這些軟體都沒有告訴你這些程式到底消耗了多少cpu時鐘,而僅僅告訴你能釋放多少記憶體。要知道,用滿了記憶體實際上是件好事,我們要注意的是cpu,真正消耗你的手機資源,消耗電池的東東。

因此,殺掉程式通常是沒有必要的(尤其是用"autokill"方式殺掉程式)。更嚴重的是,這樣做會更快的拖垮你的手機能力和電池效能。不管是手動殺掉程序,還是自動的殺掉程序,重新開啟程式,你實際上是在用cpu資源來做這件事。

事實上,這些程序管理軟體消耗了系統資源。而且,這些軟體會莫名其妙的殺死其他程式造成亂七八糟的結果(尤其對些小白來說)。所有的這些,告訴我們,你的手機在用它自己的方式工作,特別是你只是個小白使用者,用這些程序管理軟體耽誤的事情比得到的要多。

那麼你應該怎麼做呢

這麼說吧,各種程式開發水平是不一樣的。很多人以前或者現在使用這些程序管理軟體,釋放記憶體,感覺手機快了那麼一點。造成這個問題的原因是,你用的軟體本身程式寫得太爛了,比如,有得程式完全沒有必要聯網時,還在聯著。

這個時候,殺掉這些程式,你能得到好處,就是說,只有你知道你在幹什麼得時候,殺掉讓你愛但是很爛的程式才能幫上你。

如果你真關心你的手機的表現和程序,還是多關注下系統程序,看看裡面說各種程式都消耗了多少資源,如果某個程式消耗太多,時不時殺掉它可能會有那麼一點幫助。

總的來說,程序管理軟體正確的用途是殺那些出錯的程式、會導致宕機有bug的程序以及疑似病毒程序等,而不是一味地追求記憶體空得多程式在記憶體裡放著,cpu不呼叫,它就是死的,一般程式你退出了它就不再執行了,不占用cpu資源(占用了cpu時間這個才是要耗電的),這就是2.2以上版本系統那個「快速啟動」的工作原理。

當然了,看了這麼多,高記憶體看著依然讓人不爽,為什麼呢? 就是不爽,沒理由,所以,以下就是為記憶體的優化----

安卓開發之SkBitmap的記憶體管理分析

2012年5月29日18 08 安卓中文網 我有話說 0人參與 安卓使用的2d圖形引擎skia,是乙個高效的2d向量圖形庫,google已經把skia開源了。skbitmap是skia中很重要的乙個類,很多畫圖動作涉及到skbitmap,它封裝了與點陣圖相關的一系列操作,了解它的記憶體管理策略有助於...

人本管理機制

建立現代企業制度,要求企業重視以人為中心的人本管理思想。實踐證明,人的因素是社會生產力發展中最根本的力量。因此,科學技術越發展,越要重視人的因素,只有充分發揮人的主觀能動性和創造性,挖掘人的潛在能力,才能提高企業的勞動生產率,這是建立現代企業制度的迫切要求。一 現代企業實現人本管理的必要性 一 實現...

創新管理機制

創新管理機制,增強協會活力 楊錚傳澧縣 湘北 心理諮詢師協會從成立到現在還不到四年,但活力逐年增加,影響逐漸擴大 長期為澧縣勵志家園的孩子進行 陪伴式 心理輔導,成立了留守兒童心理援助指導中心,承接了中華少年兒童慈善總會的資助專案 留守兒童心理援助專案 同時開展農村留守兒童學習興趣的實證研究出了科研...