前言
這是一個有爭議的問題,使用者巴不得使用的應用佔用越小的記憶體越好。雖然現在國內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 包名稱
會產生以下幾個疑問:
- 1.heapsize的最大值為512m,如果我需要開銷1024m怎麼辦?
- 2.如果是動態分配,那其它應用把記憶體都搶光了呢?
怎麼解決:
通過分析,發現國內的超級app都已經在用的一個辦法,就是把應用做成多程式的。有時一個app多達三四個程式已經是很常見的事情了。感興趣可以自己去看一下程式表。
多程式的應用怎麼去寫,和程式間通訊怎麼使用不是本文的討論範圍內,我們只說申請更多記憶體。在本質上一個android應用就是一個或多個程式在不同的虛擬機器中執行,而一個程式就對應著自己的一個虛擬機器。那麼rom廠商給定的限制是單個虛擬機器最大記憶體配置。如果我們是多程式就等於是多個虛擬機器。自然也就獲取了更多的記憶體分配。
什麼時候用?
當我們只有一個程式的時候,某個元件中或頁面中突然需要開闢大量記憶體空間。表現的情況為卡頓、掉幀、OOM等。(因為在動態分配記憶體和釋放無用的資源)
常見具體場景有:
WebView獨立程式、多媒體播放獨立程式、IO讀寫、推送服務、長連結服務等
注意:
不需要刻意給App增加多程式,它不是必須的。
多程式帶來的問題是應用之間通訊的問題,即跨程式通訊,目前市面上已經可用的框架解決。