天天看點

android 記憶體優化

OOM

      記憶體洩漏引起很多問題:

     1:節目卡頓。反應慢(高記憶體使用情況JVM 虛拟機的頻繁離職GC)

     2:消失

     3:直接崩潰

ANDROID 記憶體面臨的問題

  1: 有限的堆記憶體,原始僅僅有16M

  2:記憶體大小消耗等依據裝置。作業系統等級。尺寸的不同而不同

  3:程式不能直接控制

  4:支援背景多任務處理

  5:執行在虛拟機之上

5R 

1.Reckon(計算)

首先須要知道你的app所消耗記憶體的情況,知己知彼才幹百戰不殆

2.Reduce(降低)

消耗更少的資源

3.Reuse(重用)

當第一次使用完以後,盡量給其它的使用

5.Recycle(回收)

回收資源

4.Review(檢查)

回想檢查你的程式。看看設計或代碼有什麼不合理的地方。

當第一次使用完以後。盡量給其它的使用

回想檢查你的程式,看看設計或代碼有什麼不合理的地方。

Reduce :

reduce 意思就是降低。直接降低記憶體的使用。是最有效的優化方法

Bitmap:

Bitmap 是記憶體消耗大戶,絕大多數的OOM崩潰都是在操作Bitmap 時産生的以下看看幾個處理圖檔的方法

圖檔顯示:

 我們須要依據需求去載入圖檔大小

 比如在清單中僅用于預覽時載入縮略圖

 僅僅有當使用者點選具體條目想看具體資訊的時候。這時另啟動一個fragement /activity 對話框等等。去顯示整個圖檔

圖檔大小:

直接使用ImageView顯示bitmap會占用較多資源,特别是圖檔較大的時候,可能導緻崩潰。

使用BitmapFactory.Options設定inSampleSize, 這樣做能夠降低對系統資源的要求。 

屬性值inSampleSize表示縮略圖大小為原始圖檔大小的幾分之中的一個,即假設這個值為2。則取出的縮略圖的寬和高都是原始圖檔的1/2,圖檔大小就為原始大小的1/4。 

圖檔像素:

Android中圖檔有四種屬性。各自是:

ALPHA_8:每一個像素占用1byte記憶體 

ARGB_4444:每一個像素占用2byte記憶體 

ARGB_8888:每一個像素占用4byte記憶體 (預設)

RGB_565:每一個像素占用2byte記憶體 

圖檔回收:

使用Bitmap過後,就須要及時的調用Bitmap.recycle()方法來釋放Bitmap占用的記憶體空間,而不要等Android系統來進行釋放。

以下是釋放Bitmap的示範樣例代碼片段。

  1. // 先推斷是否已經回收  
  2. if(bitmap != null && !bitmap.isRecycled()){  
  3.     // 回收而且置為null  
  4.     bitmap.recycle();  
  5.     bitmap = null;  
  6. }  
  7. System.gc()

究竟什麼時候使用軟引用,什麼時候使用弱引用呢?

個人覺得。假設僅僅是想避免OutOfMemory異常的發生。則能夠使用軟引用。假設對于應用的性能更在意,想盡快回收一些占用記憶體比較大的對象,則能夠使用弱引用。

還有就是能夠依據對象是否常常使用來推斷。假設該對象可能會常常使用的,就盡量用軟引用。假設該對象不被使用的可能性更大些,就能夠用弱引用。

另外,和弱引用功能類似的是WeakHashMap。WeakHashMap對于一個給定的鍵。其映射的存在并不阻止垃圾回收器對該鍵的回收。回收以後,其條目從映射中有效地移除。

WeakHashMap使用ReferenceQueue實作的這樣的機制。

首先須要知道你的app所消耗記憶體的情況。知己知彼才幹百戰不殆

回想檢查你的程式。看看設計或什麼是不合理的代碼。

版權聲明:本文部落客原創文章,部落格,未經同意不得轉載。

上一篇: Apache

繼續閱讀