最近看一個(gè)開(kāi)源項(xiàng)目 發(fā)現(xiàn)它定義了android:largeHeap。之前沒(méi)接觸過(guò),就做點(diǎn)筆記記錄一下。
先看一下一些跟這篇文章相關(guān)的一些基礎(chǔ)概念
手機(jī)內(nèi)存、cup是固定的。隨著市場(chǎng)的app數(shù)量的不斷增加,我們要保證自己的app能穩(wěn)定運(yùn)行,我們需要格外注意app的性能。android會(huì)公平地為每一個(gè)app分配一個(gè)可用的內(nèi)存,不管現(xiàn)在手機(jī)的空閑內(nèi)存是否多,就算整個(gè)手機(jī)只有你一個(gè)app,也不會(huì)允許你肆意地把所有內(nèi)存都占用掉。
這里面有幾個(gè)關(guān)鍵名詞
- heapstartsize(堆分配的初始大小)
- heapgrowthlimit(單個(gè)應(yīng)用程序最大內(nèi)存限制)
- heapsize(單個(gè)java虛擬機(jī)最大的內(nèi)存限制)
這些指標(biāo)的大小跟機(jī)型有關(guān)系
例如我的紅米4note的heapgrowthlimit是256M
如何查?(這里要注意的是shell 命令必須要加 “”)
查看單個(gè)應(yīng)用程序最大內(nèi)存限制: adb shell "getprop|grep heapgrowthlimit"
這些指標(biāo)如何體現(xiàn)?
從上圖可知:
app使用過(guò)程中需要給對(duì)象分配內(nèi)存,則先會(huì)去看,現(xiàn)在是否有足夠的內(nèi)存,如果內(nèi)存不夠,先觸發(fā)內(nèi)存回收GC(Garbage Collection)操作,釋放的無(wú)用的對(duì)象內(nèi)存之后,如果內(nèi)存還不夠,系統(tǒng)才會(huì)給app增加內(nèi)存分配,那么,增加多少內(nèi)存,這個(gè)值要受到目標(biāo)內(nèi)存利用率的影響。
那么app的內(nèi)存可以無(wú)限制增長(zhǎng)嗎?當(dāng)然不可能。app的內(nèi)存最大值,默認(rèn)情況下,就是前面所說(shuō)的單個(gè)應(yīng)用程序最大內(nèi)存限制(heapgrowthlimit),但是系統(tǒng)給了一定的擴(kuò)展空間,開(kāi)發(fā)者可以在manifest文件中增加 android:largeHeap="true" 這個(gè)語(yǔ)句,就可擴(kuò)展這個(gè)最大值。如果app使用過(guò)程中占用的內(nèi)存超過(guò)這個(gè)最大值,就會(huì)發(fā)生OOM,導(dǎo)致app閃退。
最后結(jié)論
通過(guò)清單文件中的 largeheap=true可以申請(qǐng)到更大的堆內(nèi)存,但在一些嚴(yán)格限制的機(jī)型上,不一定有效。