[Android 效能最佳化系列]記憶體之基礎篇--Android怎樣管理記憶體

來源:互聯網
上載者:User

標籤:mil   tools   tin   UI   文檔   掃描   保留   get   學習   

大家假設喜歡我的部落格,請關注一下我的微博,請點擊這裡(http://weibo.com/kifile),謝謝

轉載請標明出處(http://blog.csdn.net/kifile),再次感謝


原文地址:http://developer.android.com/training/articles/memory.html

在接下來的一段時間裡,我會每天翻譯一部分關於效能提升的Android官方文檔給大家

以下是本次的本文:

################

隨機訪問儲存空間(Ram) 無論在哪種軟體開發環境中都是一種極其寶貴的資源,而在移動開發平台下,極其有限的實體記憶體則更為寶貴。

因此。儘管Android的Dalvik虛擬機器會運行記憶體回收。但這不代表你能夠對你應用的記憶體配置和釋放不聞不問。

為了使記憶體回收期可以回收你應用中的記憶體。你須要避免記憶體泄露(一般是因為在全域變數持有某個對象引起的),以及在適當的時候釋放點引用對象(比方在生命週期中)。

對於大多數應用而言,Dalvik虛擬機器的記憶體回收行程會幫你回收掉那些不再處於範圍中的對象的記憶體。

本文將介紹 Android 是怎樣管理記憶體進程以及記憶體配置,以及怎樣在開發過程中降低記憶體使用量。

假設對於 Java 的清理資源機制,你還希望瞭解的很多其它。那麼你能夠去看看一些關於資源引用的書籍或者線上文檔。假設你正在尋找怎樣分析當前應用記憶體使用量的資料。那麼你能夠參考這篇文章(Investingating Your RAM Usage)。


Android 怎樣管理記憶體

Android 儘管沒有提供記憶體的交換空間,可是他使用了分頁和記憶體對應檔來管理記憶體。這代表不論什麼你改動過的記憶體,不論是分配了一個新的對象,再或者是更改了記憶體映射夜的操作,都將在保留在記憶體,以至於不能被釋放。

從你的應用中釋放這些記憶體唯一的方法就是將使用的對象釋放。使得記憶體回收機制可以可以回收他。唯一的例外是,對於那些沒有被更改的資料,比如代碼,當系統希望在別的地方使用他的時候,就被系統調用到哪裡。


公有記憶體

Android 為了在RAM中可以存放盡量多的資源,因此他同意某些共同擁有記憶體跨進程使用。他的原理例如以下:

1.每個應用進程都是被一個叫做 Zygote 的進程負責出來的。

Zygote 進程是在系統啟動的時候自己主動啟動的。而且內部載入了非常多公用架構代碼以及資源(比如 Activity 主題等)。啟動一個新應用的時候。系統從 Zygote 進程中複製這些資源。然後在新進程中執行應用代碼。這就同意架構和資源中的大量記憶體資源被跨進程複用。

2.大多數待用資料是通過記憶體映射放置到進程中。

這不僅代表著相同的資料可以被跨進程分享。相同代表著當須要的時候可以隨時被調用。舉個範例,待用資料包含:Dalvik 碼(使用先行編譯的.odex來直接調用),應用資源(國通簡曆資源地圖表來調用)。以及一些預設的項目資源,比如在.so 檔案裡的本地代碼

3.在非常多地方。Android 都會通過直接分配記憶體地區來跨進程分享相同的動態 RAM。比如,表單 Surface 使用公用記憶體在應用和螢幕排序,Cursor 緩衝在 ContentProvider 和client之間使用相同的記憶體

因為公用記憶體的使用,我們須要關心你的應用須要使用多少記憶體。

怎樣正確分析應用記憶體使用量請參看Investingating Your RAM Usage。


分配和釋放應用記憶體

下面是關於 Android 怎樣分配和釋放記憶體的部分:

1.每一個進程的Dalvik 堆會被限制在一個虛擬記憶體範圍內。

這代表著邏輯堆的大小能夠隨著他的須要而增長(當然系統會限制每一個應用的最大記憶體佔用)

2.每一個堆的邏輯大小和堆使用的實體記憶體並非一樣。當檢查應用的堆的時候,Android 會計算一個叫做比例大小(PPS)的值,這會將與其它應用共用的髒資料和清潔資料都計算在內。你的PPS的總值將被系統覺得是實體記憶體的值。

更具體的資訊請查看Investingating Your RAM Usage。

3.Dalvik堆並不會壓縮堆的邏輯尺寸。這代表著Android並不會通過清理空間來減小堆得大小。Android僅僅在堆沒有剩餘空間的時候才對堆本身採取回收措施。但這並不代表被堆使用的實體記憶體能夠得到釋放。在記憶體回收之後。Dalvik會掃描堆來找到不用的記憶體頁,並通過madvise將這些記憶體頁釋放到核心空間。因此大批量的分配或者釋放對象將會回收使用過的實體記憶體。雖然如此,從那些小的資源中回收記憶體空間效果並非非常好。由於存放這些小資源的分頁,非常可能被其它對象所使用,導致不能釋放。


限制應用記憶體

Android為了保證自身的多任務環境,他為每個應用設定了堆的硬體限制。這個限制取決於裝置擁有多少RAM。假設你的應用已經達到了堆的上限,而且還希望分配很多其它的記憶體空間,那麼就會導致OOM。

在某種條件下。你也許希望知道在當前裝置上系統最大同意的堆空間。打個例如說用來決定緩衝的大小。

那麼你能夠通過查詢getMemoryClass()來擷取到這些系統資料。他會將你應用可用的記憶體作為一個int類型的值進行返回,這將會在以下被討論。


切換應用

當使用者在應用之間進行切換時,Android使用最近最少使用演算法(LRU)將進程儲存在一個前台應用組件列表中,而非存放在交換空間。比方說當使用者初次開機一個應用的時候,該應用的進程就會被建立,可是當使用者離開這個應用的時候,應用卻沒有全然退出。系統將儲存進程的緩衝,這樣一來當使用者接下來返回到當前應用的時候,這個緩衝就能夠被儘可能快的調用,以提升進入程式的速度。

假設你的應用有一個緩衝的進程,而且他保持了他所須要的記憶體。那麼即使在使用者沒有使用到他的時候,也會限制系統的總體效能。因此當系統記憶體資源不足的時候,他就可能會殺死那些近期沒有被使用到的進程。所以為了使自己進程可以儘可能的保持,最好跟著以下的章節學習,將自己的資源進行釋放

假設希望瞭解很多其它關於進程在非前台環境下是怎樣被緩衝。以及Android怎樣決定哪個進程被殺死的資訊,那麼請參看進程與線程


接下來。能夠看看應用是怎樣管理自己的記憶體的

[Android 效能最佳化系列]記憶體之提升篇--應用應該怎樣管理記憶體

[Android 效能最佳化系列]記憶體之基礎篇--Android怎樣管理記憶體

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.