Java 使用軟引用有效避免OOM 問題

package reference;

import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

/*
* @author: wjf
* @version: 2016年3月30日 下午3:55:53
*/

public class TestReference {
    public static void main(String[] args){
        /*
         * java 中 四中引用 方法強引用,軟引用,弱引用,虛引用
         * 強引用,大多數適用場景,只有有強引用存在就不會被GC 回收,
         * 軟引用,內存不足時,會被gc 回收
         * 弱引用,gc 執行時,就會被回收
         * 虛引用, 虛引用和前面的軟引用、弱引用不同,它並不影響對象的生命週期。在java中用java.lang.ref.PhantomReference類表示。如果一個對象與虛引用關聯,則跟沒有引用與之關聯一樣,在任何時候都可能被垃圾回收器回收。

  要注意的是,虛引用必須和引用隊列關聯使用,當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會把這個虛引用加入到與之 關聯的引用隊列中。程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。如果程序發現某個虛引用已經被加入到引用隊列,那麼就可以在所引用的對象的內存被回收之前採取必要的行動。
         * 
         * 適用 軟引用和弱引用可以有效結果OOM 問題,
         * 如下場景:
         * 當需要從本地讀取大量圖片時,如果從本地硬盤讀取,則嚴重影響性能,如果都加載到內存中,則可能發生內存溢出的危險,
         * 適用 軟引用可以有效解決問題。當內存不足時,gc 自動清除緩存的圖片對象。
         */
//      private Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();
//      <br>....
//      public void addBitmapToCache(String path) {
//       
//              // 強引用的Bitmap對象
//       
//              Bitmap bitmap = BitmapFactory.decodeFile(path);
//       
//              // 軟引用的Bitmap對象
//       
//              SoftReference<Bitmap> softBitmap = new SoftReference<Bitmap>(bitmap);
//       
//              // 添加該對象到Map中使其緩存
//       
//              imageCache.put(path, softBitmap);
//       
//          }
//       
//       public Bitmap getBitmapByPath(String path) {
//       
//              // 從緩存中取軟引用的Bitmap對象
//       
//              SoftReference<Bitmap> softBitmap = imageCache.get(path);
//       
//              // 判斷是否存在軟引用
//       
//              if (softBitmap == null) {
//       
//                  return null;
//       
//              }
//       
//              // 取出Bitmap對象,如果由於內存不足Bitmap被回收,將取得空
//       
//              Bitmap bitmap = softBitmap.get();
//       
//              return bitmap;
//       }

        SoftReference<String> s=new SoftReference<String>(new String("wangjianfei"));
        WeakReference<String> ws=new WeakReference<String>(new String("csm"));
        System.gc();

        System.out.println(s.get());
        System.out.println(ws.get());
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章