為App申請更多的記憶體空間

香脆的大雞排發表於2018-01-09

前言

這是一個有爭議的問題,使用者巴不得使用的應用佔用越小的記憶體越好。雖然現在國內android的裝置記憶體越來越大。現在比較難再出現上古世紀的低記憶體kill問題。

本質

但非要獲取更多也不是沒辦法。我們先從本質說起。首先在android中,每一臺裝置在/system/build.prop檔案中就已經被標明瞭虛擬機器最多被使用多少記憶體。如下:

dalvik.vm.heapstartsize=16m
dalvik.vm.heapgrowthlimit=192m
dalvik.vm.heapsize=512m
dalvik.vm.heaptargetutilization=0.75
dalvik.vm.heapminfree=512k
dalvik.vm.heapmaxfree=8m  
複製程式碼

你可以使用在shell下你可以使用cat/vi命令開啟它,來檢視你自己的裝置資訊。注意需要su許可權。

在android中一個程式屬於一個虛擬機器,那麼虛擬機器在android中是動態分配記憶體的。這裡有三個關鍵資訊值得注意:

  • 1.heapstartsize是指應用剛被啟動時的記憶體大小。
  • 2.heapgrowthlimit是指動態分配的最多記憶體大小。
  • 3.heapsize是指應用配置了largeHeap屬性後可用最大空間。 (超過該值會OOM)

我們得到一個結論,在裝置上如果我們需要更大的記憶體空間就需要在應用中配置android:largeHeap為true。

檢視應用記憶體配分情況:

shell下輸入:dumpsys meminfo -a 包名稱

為App申請更多的記憶體空間

會產生以下幾個疑問:

  • 1.heapsize的最大值為512m,如果我需要開銷1024m怎麼辦?
  • 2.如果是動態分配,那其它應用把記憶體都搶光了呢?

怎麼解決:

通過分析,發現國內的超級app都已經在用的一個辦法,就是把應用做成多程式的。有時一個app多達三四個程式已經是很常見的事情了。感興趣可以自己去看一下程式表。

多程式的應用怎麼去寫,和程式間通訊怎麼使用不是本文的討論範圍內,我們只說申請更多記憶體。在本質上一個android應用就是一個或多個程式在不同的虛擬機器中執行,而一個程式就對應著自己的一個虛擬機器。那麼rom廠商給定的限制是單個虛擬機器最大記憶體配置。如果我們是多程式就等於是多個虛擬機器。自然也就獲取了更多的記憶體分配。

什麼時候用?

當我們只有一個程式的時候,某個元件中或頁面中突然需要開闢大量記憶體空間。表現的情況為卡頓、掉幀、OOM等。(因為在動態分配記憶體和釋放無用的資源)

常見具體場景有:

WebView獨立程式、多媒體播放獨立程式、IO讀寫、推送服務、長連結服務等

注意:

不需要刻意給App增加多程式,它不是必須的。

多程式帶來的問題是應用之間通訊的問題,即跨程式通訊,目前市面上已經可用的框架解決。

相關文章