昨天在模擬器上給gallery放入圖片的時候,出現(xiàn)java.lang.OutOfMemoryError: bitmap size exceeds VM budget 異常,圖像大小超過了RAM內(nèi)存。
模擬器RAM比較小,只有8M內(nèi)存,當(dāng)我放入的大量的圖片(每個100多K左右),就出現(xiàn)上面的原因。由于每張圖片先前是壓縮的情況。放入到Bitmap的時候,大小會變大,導(dǎo)致超出RAM內(nèi)存,具體解決辦法如下:
//解決加載圖片 內(nèi)存溢出的問題
//Options 只保存圖片尺寸大小,不保存圖片到內(nèi)存
BitmapFactory.Options opts = new BitmapFactory.Options();
//縮放的比例,縮放是很難按準(zhǔn)備的比例進行縮放的,其值表明縮放的倍數(shù),SDK中建議其值是2的指數(shù)值,值越大會導(dǎo)致圖片不清晰
opts.inSampleSize = 4;
Bitmap bmp = null;
bmp = BitmapFactory.decodeResource(getResources(), mImageIds[position],opts);
...
//回收
bmp.recycle();
通過上面的方式解決了,但是這并不是最完美的解決方式。
通過一些了解,得知如下:
優(yōu)化Dalvik虛擬機的堆內(nèi)存分配
對于Android平臺來說,其托管層使用的Dalvik Java VM從目前的表現(xiàn)來看還有很多地方可以優(yōu)化處理,比如我們在開發(fā)一些大型游戲或耗資源的應(yīng)用中可能考慮手動干涉GC處理,使用 dalvik.system.VMRuntime類提供的setTargetHeapUtilization方法可以增強程序堆內(nèi)存的處理效率。當(dāng)然具體 原理我們可以參考開源工程,這里我們僅說下使用方法: private final static float TARGET_HEAP_UTILIZATION = 0.75f; 在程序onCreate時就可以調(diào)用 VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 即可。
Android堆內(nèi)存也可自己定義大小
對于一些Android項目,影響性能瓶頸的主要是Android自己內(nèi)存管理機制問題,目前手機廠商對RAM都比較吝嗇,對于軟件的流暢性來說RAM對 性能的影響十分敏感,除了 優(yōu)化Dalvik虛擬機的堆內(nèi)存分配外,我們還可以強制定義自己軟件的對內(nèi)存大小,我們使用Dalvik提供的 dalvik.system.VMRuntime類來設(shè)置最小堆內(nèi)存為例:
private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //設(shè)置最小heap內(nèi)存為6MB大小。當(dāng)然對于內(nèi)存吃緊來說還可以通過手動干涉GC去處理