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());
}
}
Java 使用軟引用有效避免OOM 問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.