前言
在開發(fā)中,一些類似Bitmap的對(duì)象會(huì)占用很大的內(nèi)存缔俄,即使使用弱引用弛秋、代碼優(yōu)化及時(shí)釋放,可以有效減少內(nèi)存泄漏現(xiàn)象的產(chǎn)生俐载。但這依然不夠蟹略,很多時(shí)候,我們需要盡量少的使用內(nèi)存遏佣。對(duì)用戶來(lái)說(shuō)挖炬,用戶并不懂內(nèi)存泄漏,但是用戶可以通過(guò)后臺(tái)查看你的內(nèi)存使用情況状婶,如果占用過(guò)大意敛,一些用戶會(huì)選擇卸載來(lái)清理門戶。
作為程序員膛虫,我們可以通過(guò)分析草姻,找出內(nèi)存占用較大的模塊,通過(guò)代碼或者其他一些方式稍刀,減少內(nèi)存使用撩独。筆者用一個(gè)例子來(lái)粗略的說(shuō)說(shuō)內(nèi)存分析及MAT工具的使用。文中有不正確的地方账月,歡迎各位指出综膀,好讓筆者及時(shí)改正,共同學(xué)習(xí)局齿。
STEP 1 準(zhǔn)備工具
在所有操作開始之前剧劝,我們需要準(zhǔn)備一些材料
首先是MAT內(nèi)存分析工具,基本沒(méi)有什么安裝過(guò)程抓歼,這里附上下載地址:
http://www.eclipse.org/mat/downloads.php
還有就是Bitmap查看工具GIMP担平,下載地址:
http://www.gimp.org/
STEP 2 獲取.hprof文件
在Android Studio中,我們可以在Monitor窗口中看到內(nèi)存的使用情況锭部,并進(jìn)行手動(dòng)GC,獲取.hprof文件等操作面褐,如圖:
在獲取.hprof文件之前拌禾,我們需要手動(dòng)回收內(nèi)存,由于系統(tǒng)內(nèi)存回收是優(yōu)先級(jí)很低的線程展哭,如果不去手動(dòng)回收湃窍,會(huì)造成我們分析的不必要失誤闻蛀,如何手動(dòng)GC?您市,點(diǎn)擊
進(jìn)行手動(dòng)回收觉痛,接著就是獲取.hprof文件,也很簡(jiǎn)單茵休,點(diǎn)擊
稍等一會(huì)兒薪棒,Android Studio會(huì)為我們截取并打開.hprof文件,我們會(huì)在Capture中看到剛剛獲取的.hprof文件:
但是此時(shí)的.hprof是不能用MAT打開的榕莺,需要導(dǎo)出才能繼續(xù)分析俐芯。
右鍵,選擇Export to standard hprof,選擇目錄保存钉鸯,第二步就完成了吧史。
STEP 3 分析內(nèi)存占用
MAT的強(qiáng)大在于它把所有的內(nèi)存占用情況以數(shù)據(jù)的形式表達(dá)出來(lái),一眼就能了解當(dāng)前的內(nèi)存占用情況唠雕。
雙擊打開解壓的Memory Analyzer贸营,F(xiàn)ile-->Open Heap Dump,選擇保存的.hprof文件,等待加載岩睁,點(diǎn)擊Finish钞脂。
等待加載,在Overview中可以查看餅狀圖:
選擇Histogram笙僚,如圖:
Histogram視圖下芳肌,點(diǎn)擊Retained Heap查看當(dāng)前內(nèi)存占用情況,并從大到小排序肋层,如圖:
到這里為止亿笤,其實(shí)我們可以看出大概了,Bitmap對(duì)內(nèi)存的占用簡(jiǎn)直令人發(fā)指栋猖。
選擇android.graphics.Bitmap净薛,查看Bitmap占用情況,右鍵-->List Objects-->withoutgoing references蒲拉,如圖:
點(diǎn)擊Retained Heap排序肃拜,我們可以看到單單一個(gè)Bitmap對(duì)象就占用了3M,而這其中類似大小的不在少數(shù)雌团。
選擇需要查看的Bitmap對(duì)象燃领,雙擊打開:
選中mBuffer,導(dǎo)出byte锦援,右鍵-->Copy-->Save Value to File猛蔽,保存到指定目錄,文件后綴名可為.data
打開安裝好的GIMP,文件-->打開曼库,選擇剛剛保存的.data文件:
其中区岗,圖像類型選擇RGBAlpha,寬度和高度填入Eclipse Analyzer中獲取的毁枯。
點(diǎn)擊打開慈缔,即可看到內(nèi)存占用的到底是個(gè)什么圖片,并且針對(duì)這些圖片進(jìn)行優(yōu)化种玛。