那天在用Profiler進(jìn)行內(nèi)存分析時暇咆,想到了一個問題:一個手機(jī)對每個APP的內(nèi)存分配極限取決于什么呢?又是如何獲取的呢爸业?
老規(guī)矩扯旷,廢話不多說,直接上代碼:
Runtime rt = Runtime.getRuntime();
long l = rt.maxMemory();//本APP能分配的最大內(nèi)存
long l1 = rt.freeMemory();//本APP目前剩余的內(nèi)存
long l2 = rt.totalMemory();//本APP目前已分配的內(nèi)存
LogUtil.loge("內(nèi)存maxMemory:"+l);
LogUtil.loge("內(nèi)存freeMemory:"+l1);
LogUtil.loge("內(nèi)存totalMemory:"+l2);
ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
int memoryClass = activityManager.getMemoryClass();//系統(tǒng)為應(yīng)用分配的內(nèi)存(無擴(kuò)充)
int largeMemoryClass = activityManager.getLargeMemoryClass();//配置AndroidManifest中l(wèi)argeHeap="true"的最大內(nèi)存
LogUtil.loge("內(nèi)存getMemoryClass:"+memoryClass);
LogUtil.loge("內(nèi)存getLargeMemoryClass:"+largeMemoryClass);
代碼很簡單某抓,相關(guān)api也都注釋清楚了惰瓜,下面我們分別看看有無配置AndroidManifest中l(wèi)argeHeap="true"打印結(jié)果的區(qū)別:
//配置AndroidManifest中l(wèi)argeHeap="true"
內(nèi)存maxMemory:536870912
內(nèi)存freeMemory:209992
內(nèi)存totalMemory:9461760
內(nèi)存getMemoryClass:192
內(nèi)存getLargeMemoryClass:512
—————————————————————————
//不配置AndroidManifest中l(wèi)argeHeap="true"
內(nèi)存maxMemory:201326592
內(nèi)存freeMemory:825464
內(nèi)存totalMemory:10162176
內(nèi)存getMemoryClass:192
內(nèi)存getLargeMemoryClass:512
說明:通過Runtime獲取的內(nèi)存單位的B崎坊,通過ActivityManager獲取的內(nèi)存單位是MB
所以,很快我們就發(fā)現(xiàn):
536870912=512*1024*1024
201326592=192*1024*1024
于是我們得出結(jié)論:
1)無論是否配置AndroidManifest中l(wèi)argeHeap="true"曲尸,通過ActivityManager獲取的兩個參數(shù)都是固定不變的
2)當(dāng)配置AndroidManifest中l(wèi)argeHeap="true"時另患,通過Runtime獲取的maxMemory為getLargeMemoryClass的值
3)當(dāng)不配置AndroidManifest中l(wèi)argeHeap="true"時,通過Runtime獲取的maxMemory為getMemoryClass的值
4)ActivityManager獲取的兩個參數(shù)其實是讀取/system/build.prop文件中手機(jī)內(nèi)存的配置參數(shù)昆箕,請看下圖:
注意紅色箭頭鹏倘,其中
dalvik.vm.heapstartsize=初始分配內(nèi)存
dalvik.vm.heapgrowthlimit=getMemoryClass
dalvik.vm.heapsize=getLargeMemoryClass
以上都是用模擬器測試及查看的結(jié)果,下面我們?yōu)榱俗尳Y(jié)果更具說服力纤泵,拿臺手機(jī)來驗證一下捏题,結(jié)果如下:
內(nèi)存maxMemory:268435456
內(nèi)存freeMemory:12174780
內(nèi)存totalMemory:39548880
內(nèi)存getMemoryClass:128
內(nèi)存getLargeMemoryClass:256
最后繁仁,想說明的是涉馅,雖然配置AndroidManifest中l(wèi)argeHeap="true"可以為自己的APP分配到更多的內(nèi)存,但是因為獲得更多的內(nèi)存黄虱,GC時間也將花費更多的時間稚矿,對性能存在一定的影響,所以捻浦,通過內(nèi)存優(yōu)化來達(dá)到節(jié)約內(nèi)存的目的才是王道拔畲А!