Android內存管理(八)內存管理小結


分享,點贊,在看,
都在這兒,點我不香嗎?

通過前面一段時間的學習總結及後期要涉及的內容,整理了下邏輯,繪製了Android內存管理及優化的思惟邏輯圖,具體以下:web


Android內存管理體系已經講解了算法

    1. 內存管理基礎緩存

    2. Android內存管理機制微信



        具體相關內容可參考以下連接
網絡


接下來內存優化將會從圖上的幾點來進行分析整理。

    1. 內存優化工具介紹

    2. Android常見的內存問題及解決方案

    3. 內存優化的體系的建設

    4. 內存問題總結及思考


今天從操做系統的角度來閒聊一下代碼開發過程當中如何配合系統作內存管理。內存就是一塊數據存儲區域,是可被操做系統調度的資源。在多任務(進程)的OS中,內存管理尤其重要,OS須要爲每個進程合理的分配內存資源。因此能夠從OS對內存和回收兩方面來理解內存管理機制。

  • 分配機制:爲每個任務(進程)分配一個合理大小的內存塊,保證每個進程可以正常的運行,同時確保進程不會佔用太多的內存。

  • 回收機制:當系統內存不足的時候,須要有一個合理的回收再分配機制,以保證新的進程能夠正常運行。回收時殺死那些正在佔用內存的進程,OS須要提供一個合理的殺死進程機制。

一樣做爲一個多任務的操做系統,Android系統對內存管理有有一套本身的方法,手機上的內存資源比PC更少,須要更加謹慎的管理內存。理解Android的內存分配機制有助於咱們寫出更高效的代碼,提升應用的性能。

下面分別從 分配 和 回收 兩方面來描述Android的內存管理機制:

分配機制

Android爲每一個進程分配內存時,採用彈性的分配方式,即剛開始並不會給應用分配不少的內存,而是給每個進程分配一個「夠用」的內存大小。這個大小值是根據每個設備的實際的物理內存大小來決定的。隨着應用的運行和使用,Android會爲進程分配一些額外的內存大小。可是分配的大小是有限度的,系統不可能爲每個應用分配無限大小的內存。

總之,Android系統須要最大限度的讓更多的進程存活在內存中,以保證用戶再次打開應用時減小應用的啓動時間,提升用戶體驗。

回收機制

Android對內存的使用方式是「盡最大限度的使用」,只有當內存不足的時候,纔會殺死其它進程來回收足夠的內存。但Android系統不可能隨便的殺死一個進程,它也有一個機制殺死進程來回收內存。

Android殺死進程有兩個參考條件:

    1. 進程優先級

Android爲每個進程分配了優先組的概念,優先組越低的進程,被殺死的機率就越大。根據進程的重要性,劃分爲5級:

  • 1)前臺進程(Foreground process)

用戶當前操做所必需的進程。一般在任意給定時間前臺進程都爲數很少。只有在內存不足以支持它們同時繼續運行這一萬不得已的狀況下,系統纔會終止它們。

  • 2)可見進程(Visible process)

沒有任何前臺組件、但仍會影響用戶在屏幕上所見內容的進程。可見進程被視爲是極其重要的進程,除非爲了維持全部前臺進程同時運行而必須終止,不然系統不會終止這些進程。

  • 3)服務進程(Service process)

儘管服務進程與用戶所見內容沒有直接關聯,可是它們一般在執行一些用戶關心的操做(例如,在後臺播放音樂或從網絡下載數據)。所以,除非內存不足以維持全部前臺進程和可見進程同時運行,不然系統會讓服務進程保持運行狀態。

  • 4)後臺進程(Background process)

後臺進程對用戶體驗沒有直接影響,系統可能隨時終止它們,以回收內存供前臺進程、可見進程或服務進程使用。一般會有不少後臺進程在運行,所以它們會保存在 LRU 列表中,以確保包含用戶最近查看的 Activity 的進程最後一個被終止。若是某個 Activity 正確實現了生命週期方法,並保存了其當前狀態,則終止其進程不會對用戶體驗產生明顯影響,由於當用戶導航回該 Activity 時,Activity 會恢復其全部可見狀態。

  • 5)空進程(Empty process)

不含任何活動應用組件的進程。保留這種進程的的惟一目的是用做緩存,以縮短下次在其中運行組件所需的啓動時間。爲使整體系統資源在進程緩存和底層內核緩存之間保持平衡,系統每每會終止這些進程。

一般,前面三種進程不會被殺死。

    1. 回收收益

當Android系統開始殺死LRU緩存中的進程時,系統會判斷每一個進程殺死後帶來的回收收益。由於Android老是傾向於殺死一個能回收更多內存的進程,從而能夠殺死更少的進程,來獲取更多的內存。殺死的進程越少,對用戶體驗的影響就越小。

爲何App要符合內存管理機制?

在Android系統中,符合內存管理機制的App,對Android系統和App來講,是一個共贏的過程。如何每個App都遵循這個規則,那麼Android系統會更加流暢,也會帶來更好的用戶體驗,App也能夠更長時間的駐留在內存中。

若是真的須要不少內存,能夠採用多進程的方式。

如何編寫符合Android內存管理機制的App?

一個遵循Android內存管理機制的App應該具備如下幾個特色:

  • 1)更少的佔用內存;

  • 2)在合適的時候,合理的釋放系統資源。

  • 3)在系統內存緊張的狀況下,能釋放掉大部分不重要的資源,來爲Android系統提供可用的內存。

  • 4)可以很合理的在特殊生命週期中,保存或者還原重要數據,以致於系統可以正確的重要恢復該應用。

所以,在開發過程當中要作到:

  • 避免建立沒必要要的對象。

  • 在合適的生命週期中,合理的管理資源。

  • 在系統內存不足時,主動釋放更多的資源。

開發時,應該如何注意App的內存管理呢?

  • 1)減小內存資源佔用

好比,使用StringBuffer,int等更少內存佔用的數據結構。

  • 2)內存溢出

主要是Bitmap。解決辦法是:減小每一個對象佔用的內存,如圖片壓縮等;申請大內存。

  • 3)內存泄露

內存泄露是指原本該被GC回收後還給系統的內存,並無被GC回收。多數是由於不合理的對象引用形成的。

解決這種問題:一、經過各類內存分析工具,好比MAT,分析運行時的內存映像文件,找出形成內存泄露的代碼,並修改。二、適當的使用WeakReference。具體問題解決方案請關注接下來的內容。




夯實基礎,關注前沿,娛樂生活

掌握更多前沿技術,獲取更多笑點 

請關注--------喘口仙氣



本文分享自微信公衆號 - 喘口仙氣(gh_db8538619cdd)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索