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的示範樣例代碼片段。
- // 先推斷是否已經回收
- if(bitmap != null && !bitmap.isRecycled()){
- // 回收而且置為null
- bitmap.recycle();
- bitmap = null;
- }
- System.gc()
究竟什麼時候使用軟引用,什麼時候使用弱引用呢?
個人覺得。假設僅僅是想避免OutOfMemory異常的發生。則能夠使用軟引用。假設對于應用的性能更在意,想盡快回收一些占用記憶體比較大的對象,則能夠使用弱引用。
還有就是能夠依據對象是否常常使用來推斷。假設該對象可能會常常使用的,就盡量用軟引用。假設該對象不被使用的可能性更大些,就能夠用弱引用。
另外,和弱引用功能類似的是WeakHashMap。WeakHashMap對于一個給定的鍵。其映射的存在并不阻止垃圾回收器對該鍵的回收。回收以後,其條目從映射中有效地移除。
WeakHashMap使用ReferenceQueue實作的這樣的機制。
首先須要知道你的app所消耗記憶體的情況。知己知彼才幹百戰不殆
回想檢查你的程式。看看設計或什麼是不合理的代碼。
版權聲明:本文部落客原創文章,部落格,未經同意不得轉載。