android 記憶體優化篇
一、圖片記憶體優化操作:
一般來說,我們對圖片進行操作比較多的就是setImageBitmap、setImageResource,這些都是通過BitmapFactory.decodeResource來獲取點陣圖,現在發現當程式需要用到的圖片較多時候,容易產生oom,因為這些法在完成decode後,最終都是通過java層的createBitmap來完成的,需要消耗更多記憶體。
現在推薦大家改用先通過BitmapFactory.decodeStream方法,建立出一個bitmap,再將其設為ImageView的source,因為decodeStream最大的祕密在於其直接呼叫JNI>>nativeDecodeAsset()來完成decode,無需再使用java層的createBitmap,從而節省了java層的空間。當然如果在讀取時加上圖片的Config引數,可以更有效的減少載入的記憶體,從而更有效阻止丟擲記憶體異常。另外,decodeStream直接拿圖片來讀取位元組碼了,不會根據機器的各種解析度來自動適應,使用了decodeStream之後,需要在hdpi和mdpi,ldpi中配置相應的圖片資源,否則在不同解析度機器上都是同樣大小(畫素點數量),顯示出來的大小就不對了。
示例:
/**
*以最省記憶體的方式讀取本地資源的圖片
*@paramcontext
*@paramresId
*@return
*/
public static readBitMap(Context context,int resId){
BitmapFactory.Optionsopt=newBitmapFactory.Options();
opt.inPreferredConfig=Bitmap.Config.RGB_565;
opt.inPurgeable=true;
opt.inInputShareable=true;
//獲取資源圖片
InputStreamis=context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is,null,opt);
}
注:
1、opt.inPurgeable=true; //為True的話表示使用BitmapFactory建立的Bitmap用於儲存Pixel的記憶體空間在系統記憶體不足時可以被回收,在應用需要再次訪問Bitmap的Pixel時(如繪製Bitmap或是呼叫getPixel),系統會再次呼叫BitmapFactory decoder重新生成Bitmap的Pixel陣列。為了能夠重新解碼影象,bitmap要能夠訪問儲存Bitmap的原始資料。
2、options.inJustDecodeBounds=false;
3、options.inSampleSize=10;//這個值越大表示圖片質量越差,這個10表示長寬為原來圖片的10分之一。
二、優化Dalvik虛擬機器的堆記憶體分配。
對於Android平臺來說,其託管層使用的DalvikJavaVM從目前的表現來看還有很多地方可以優化處理,比如我們在開發一些大型遊戲或耗資源的應用中可能考慮手動干涉GC處理,使用dalvik.system.VMRuntime類提供的setTargetHeapUtilization方法可以增強程式堆記憶體的處理效率。使用方法:
privatefinalstaticfloatTARGET_HEAP_UTILIZATION=0.75f;
VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);
或者:
privatefinalstaticintCWJ_HEAP_SIZE=6*1024*1024;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);//設定最小heap記憶體為6MB大小
相關文章
- Android效能優化篇之記憶體優化--記憶體洩漏Android優化記憶體
- Android記憶體優化Android記憶體優化
- Android深度效能優化--記憶體優化(一篇就夠)Android優化記憶體
- Android Note - 記憶體優化Android記憶體優化
- Android 效能優化之記憶體優化Android優化記憶體
- 淺談Android記憶體優化Android記憶體優化
- Android記憶體優化全解析Android記憶體優化
- Android記憶體優化之圖片優化Android記憶體優化
- Linux 效能優化之 記憶體 篇Linux優化記憶體
- Android 是如何管理 App 記憶體的 — Android 記憶體優化第二彈AndroidAPP記憶體優化
- android記憶體管理機制與優化Android記憶體優化
- android效能評測與優化-記憶體Android優化記憶體
- 讀書筆記2-記憶體優化篇筆記記憶體優化
- Linux效能優化實戰記憶體篇(五)Linux優化記憶體
- Android效能優化,Startalk會話頁GIF記憶體優化實踐Android優化會話記憶體
- Android系統Bitmap記憶體分配原理與優化Android記憶體優化
- 分析並優化 Android 應用記憶體佔用優化Android記憶體
- 效能優化——記憶體洩漏(1)入門篇優化記憶體
- 關於redis記憶體分析,記憶體優化Redis記憶體優化
- Android效能優化:手把手帶你全面實現記憶體優化Android優化記憶體
- GC那些事兒–Android記憶體優化第一彈GCAndroid記憶體優化
- 記憶體優化相關記憶體優化
- 1.記憶體優化(一)記憶體洩漏記憶體優化
- 實踐App記憶體優化:如何有序地做記憶體分析與優化APP記憶體優化
- android 關於記憶體優化的一些總結Android記憶體優化
- Android記憶體洩漏監控和優化技巧總結Android記憶體優化
- iOS圖片記憶體優化iOS記憶體優化
- App記憶體優化-實踐APP記憶體優化
- Redis-記憶體優化(一)Redis記憶體優化
- JNI記憶體管理及優化記憶體優化
- mariadb 記憶體佔用優化記憶體優化
- Android記憶體優化(四)解析Memory Monitor、Allocation Tracker和Heap DumpAndroid記憶體優化
- psi 跟Android記憶體最佳化Android記憶體
- win10怎麼優化記憶體 win10系統記憶體優化的方法Win10優化記憶體
- 雲音樂 Android 記憶體監控探索篇Android記憶體
- 2.記憶體優化(二)優化分析記憶體優化
- Redis 記憶體優化神技,小記憶體儲存大資料Redis記憶體優化大資料
- HBase記憶體配置及JVM優化記憶體JVM優化
- iOS 使用Instruments優化記憶體效能iOS優化記憶體