垃圾回收的機制主要是看對象是否有引用指向該對象,java對象的引用包括:強引用,軟引用,弱引用,虛引用
1.強引用
是指創建一個對象並把這個對象賦給一個引用變量。
強引用有引用變量指向時永遠不會被垃圾回收,JVM寧願拋出OutOfMemory錯誤也不會回收這種對象。
Object obj = new Object();
可直接通過obj取得對應的對象 如obj.equels(new Object());
2. 軟引用:
非必須引用,內存溢出之前進行回收,可以通過以下代碼實現
Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;
sf.get();//有時候會返回null
這時候sf是對obj的一個軟引用,通過sf.get()方法可以取到這個對象,當然,當這個對象被標記爲需要回收的對象時,則返回null;
軟引用主要用戶實現類似緩存的功能,在內存足夠的情況下直接通過軟引用取值,無需從繁忙的真實來源查詢數據,提升速度;當內存不足時,自動刪除這部分緩存數據,從真正的來源查詢這些數據。
軟引用可用來實現內存敏感的高速緩存。
//定義一個HashMap,保存軟引用的Bitmap對象,可防止OOM
private Map<String, SoftReference<Bitmap>> imageCaches =
Collections.synchronizedMap(new HashMap<String, SoftReference<Bitmap>>());
/**添加軟引用Bitmap到Map中,使其緩存*/
public void addBitmapToCache(String path) {
imageCaches.put(path, new SoftReference<Bitmap>
(BitmapFactory.decodeFile(path)));
}
/** 從緩存中取軟引用的Bitmap對象*/
public Bitmap getBitmapFromCache(String path) {
SoftReference<Bitmap> softBitmap = imageCaches.get(path);
//如果軟引用還存在,那麼直接就可以獲取這個對象的相關數 據...這樣就實現了cache...
if (softBitmap != null) {
return softBitmap.get();
} else {
//重新實例化對象,獲取數據信息
}
}
3. 弱引用(WeakReference)
弱引用也是用來描述非必需對象的,當JVM進行垃圾回收時,無論內存是否充足,都會回收被弱引用關聯的對象。在java中,用java.lang.ref.WeakReference類來表示。
4. 虛引用
虛引用主要用來跟蹤對象被垃圾回收器回收的活動。虛引用與軟引用和弱引用的一個區別在於:虛引用必須和引用隊列 (ReferenceQueue)聯合使用。當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會在回收對象的內存之前,把這個虛引用加入到與之 關聯的引用隊列中。
ReferenceQueue queue = new ReferenceQueue ();
PhantomReference pr = new PhantomReference (object, queue);
程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。如果程序發現某個虛引用已經被加入到引用隊列,那麼就可以在所引用的對象的內存被回收之前採取必要的行動