Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android性能優化之內存優化

Android性能優化之內存優化

編輯:關於Android編程

1、內存溢出的原因

1.1、內存洩漏

內存洩漏和內存溢出的區別:

內存洩漏:程序中存在對無用對象的引用,導致GC無法回收。內存洩漏最終會導致oom。

內存溢出:程序在申請內存時,沒有足夠的內存空間供其使用,出現outofmemory。

1.2、保存多個耗用內存過大的對象

應用的某些邏輯操作消耗掉大量內存(譬如加載一張不經過處理的超大超高清圖片等)導致超過阈值。

2、內存優化

2.1、bitmap

1)對bitmap進行壓縮

通過BitmapFactory.Options設置inSampleSize采樣率,並設置inJustDecodeBounds為true後圖片就不會加載進內存,只是計算原始圖片的大小,在對圖片壓縮處理完成之後,在設置為false就可以加載到內存了。

2)對bitmap進行回收

Bitmap對象不再被使用的時候,調用Bitmap.recycle()方法來釋放Bitmap占用的內存空間,並進行空引用,以便gc進行回收。

3)bitmap進行緩存

Bitmap緩存分為兩種:一種是內存緩存,一種是硬盤緩存。

內存緩存(LruCache):

LruCache類是非常適合用作緩存Bitmap任務的,它將最近被引用到的對象存儲在一個強引用的LinkedHashMap中,並且在緩存超過了指定大小之後將最近不常使用的對象釋放掉。

2.2、修改對象引用類型

引用類型:

引用分為四種級別,這四種級別由高到低依次為:強引用>軟引用>弱引用>虛引用。

1)強引用(strongreference)
如:Objectobject=newObject(),object就是一個強引用了。當內存空間不足,Java虛擬機寧願拋出OutOfMemoryError錯誤,使程序異常終止,也不會靠隨意回收具有強引用的對象來解決內存不足問題。

2)軟引用(SoftReference)
只有內存不夠時才回收,常用於緩存;當內存達到一個閥值,GC就會去回收它;

3)弱引用(WeakReference)

弱引用的對象擁有更短暫的生命周期。在垃圾回收器線程掃描它所管轄的內存區域的過程中,一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。

4)虛引用(PhantomReference)

"虛引用"顧名思義,就是形同虛設,虛引用並不會決定對象的生命周期。如果一個對象僅持有虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收。

但是對於SoftReference(軟引用)或者WeakReference(弱引用)的Bitmap緩存方案,現在已經不推薦使用了。自Android2.3版本(APILevel9)開始,垃圾回收器更著重於對軟/弱引用的回收。

2.3、適配器Adapter

1)復用用convertview

復用convertview布局文件的渲染次數,因為每次調用getView時都會重新創建View,這樣之前的View可能還沒有銷毀,加之不斷的新建View勢必會造成內存洩露;

2)使用ViewHoder模式

使用viewhoder可以減少findviewbyid的次數,因為通過setTag將視圖的tag存入一個數據結構,這個數據結構包含了指向我們要綁定數據的視圖的引用;

2.4、其他

1)盡量少食用enmu

枚舉相對於靜態常量來說,需要兩倍甚至更多的內存.

2)資源釋放

使用數據庫,IO流的時候記得關閉資源.

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved