Android內存溢出的解決方法(VMRuntime.getRuntime().setMini...

轉自:http://www.apkbus.com/forum.php?mod=viewthread&tid=898 php

模擬器上給gallery放入圖片的時候,出現java.lang.OutOfMemoryError: bitmap size exceeds VM budget 異常,圖像大小超過了RAM內存。
模擬器RAM比較小,只有8M內存,當我放入的大量的圖片(每一個100多K左右),就出現上面的緣由。因爲每張圖片先前是壓縮的狀況。放入到Bitmap的時候,大小會變大,致使超出RAM內存,具體解決辦法以下:

Java代碼: java

//解決加載圖片 內存溢出的問題
//Options 只保存圖片尺寸大小,不保存圖片到內存
BitmapFactory.Options opts = new BitmapFactory.Options();
//縮放的比例,縮放是很難按準備的比例進行縮放的,其值代表縮放的倍數,SDK中建議其值是2的指數值,值越大會致使圖片不清晰
opts.inSampleSize = 4;
Bitmap bmp = null;
bmp = BitmapFactory.decodeResource(getResources(), mImageIds[position],opts);
...
//回收
bmp.recycle();


經過上面的方式解決了,可是這並非最完美的解決方式。
       經過一些瞭解,得知以下:

       優化Dalvik虛擬機的堆內存分配

       對於Android平臺來講,其託管層使用的Dalvik Java VM從目前的表現來看還有不少地方能夠優化處理,好比咱們在開發一些大型遊戲或耗資源的應用中可能考慮手動干涉GC處理,使用 dalvik.system.VMRuntime類提供的setTargetHeapUtilization方法能夠加強程序堆內存的處理效率。固然具體原理咱們能夠參考開源工程,這裏咱們僅說下使用方法: private final static float TARGET_HEAP_UTILIZATION = 0.75f;在程序onCreate時就能夠調用VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 便可。

       Android堆內存也可本身定義大小

       對於一些Android項目,影響性能瓶頸的主要是Android本身內存管理機制問題,目前手機廠商對RAM都比較吝嗇,對於軟件的流暢性來講RAM對性能的影響十分敏感,除了 優化Dalvik虛擬機的堆內存分配外,咱們還能夠強制定義本身軟件的堆內存大小,咱們使用Dalvik提供的 dalvik.system.VMRuntime類來設置最小堆內存爲例:

       private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;

       VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);
//設置最小heap內存爲6MB大小。固然對於內存吃緊來講還能夠經過手動干涉GC去處理 性能

相關文章
相關標籤/搜索