閱讀249 返回首頁    go 技術社區[雲棲]


java弱引用(WeakReference)和SoftReference的區別以及在android內存處理的作用

weakReference一般用來防止內存泄漏,要保證內存被VM回收 

softReference的話,好像多用作來實現cache機製.

 

WeakReference: 
弱引用對象,它們並不禁止其指示對象變得可終結,並被終結,然後被回收。弱引用最常用於實現規範化的映射。  

假定垃圾回收器確定在某一時間點上某個對象是弱可到達對象。這時,它將自動清除針對此對象的所有弱引用,以及通過強引用鏈和軟引用,可以從其到達該對象的針對任何其他弱可到達對象的所有弱引用。同時它將聲明所有以前的弱可到達對象為可終結的。在同一時間或晚些時候,它將那些已經向引用隊列注冊的新清除的弱引用加入隊列。   


SoftReference: 
軟引用對象,在響應內存需要時,由垃圾回收器決定是否清除此對象。軟引用對象最常用於實現內存敏感的緩存。  

假定垃圾回收器確定在某一時間點某個對象是軟可到達對象。這時,它可以選擇自動清除針對該對象的所有軟引用,以及通過強引用鏈,從其可以到達該對象的針對任何其他軟可到達對象的所有軟引用。在同一時間或晚些時候,它會將那些已經向引用隊列注冊的新清除的軟引用加入隊列。   

軟可到達對象的所有軟引用都要保證在虛擬機拋出   OutOfMemoryError   之前已經被清除。否則,清除軟引用的時間或者清除不同對象的一組此類引用的順序將不受任何約束。然而,虛擬機實現不鼓勵清除最近訪問或使用過的軟引用。   

此類的直接實例可用於實現簡單緩存;該類或其派生的子類還可用於更大型的數據結構,以實現更複雜的緩存。隻要軟引用的指示對象是強可到達對象,即正在實際使用的對象,就不會清除軟引用。例如,通過保持最近使用的項的強指示對象,並由垃圾回收器決定是否放棄剩餘的項,複雜的緩存可以防止放棄最近使用的項 

 

<!---*******************************************************************************************************************************************-->

[java] view plaincopy
  1. private class MyAdapter extends BaseAdapter {    
  2.   
  3. private ArrayList<SoftReference<Bitmap>> mBitmapRefs = new ArrayList<SoftReference<Bitmap>>();    
  4. private ArrayList<Value> mValues;    
  5. private Context mContext;    
  6. private LayoutInflater mInflater;    
  7.   
  8. MyAdapter(Context context, ArrayList<Value> values) {    
  9.     mContext = context;    
  10.     mValues = values;    
  11.     mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);    
  12. }    
  13. public int getCount() {    
  14.     return mValues.size();    
  15. }    
  16.   
  17. public Object getItem(int i) {    
  18.     return mValues.get(i);    
  19. }    
  20.   
  21. public long getItemId(int i) {    
  22.     return i;    
  23. }    
  24.   
  25. public View getView(int i, View view, ViewGroup viewGroup) {    
  26.     View newView = null;    
  27.     if(view != null) {    
  28.         newView = view;    
  29.     } else {    
  30.         newView =(View)mInflater.inflate(R.layout.image_view, false);    
  31.     }    
  32.   
  33.     Bitmap bitmap = BitmapFactory.decodeFile(mValues.get(i).fileName);    
  34.     mBitmapRefs.add(new SoftReference<Bitmap>(bitmap));     //此處加入ArrayList    
  35.     ((ImageView)newView).setImageBitmap(bitmap);    
  36.   
  37.     return newView;    
  38. }    
  39. }    


最後更新:2017-04-02 17:09:26

  上一篇:go Android 內存溢出解決方案(OOM) 整理總結
  下一篇:go android,性能優化,內存優化管理,高級緩存