四、Java對引用的分類
層級 |
什麼時候被記憶體回收 |
用途 |
存留時間 |
強 |
從來不會 |
對象的一般狀態 |
JVM停止運行時終止 |
軟 |
在記憶體不足時 |
對象簡單?緩衝 |
記憶體不足時終止 |
弱 |
在記憶體回收時 |
對象緩衝 |
gc運行後終止 |
假象 |
Unknown |
Unknown |
Unknown |
1、強引用:
public static void main(String[] args) {
MyDate date = new MyDate();
System.gc();
}
解釋:即使顯式調用了記憶體回收,但是用於date是強引用,date沒有被回收
2、軟引用:
public static void main(String[] args) {
SoftReference ref = new SoftReference(new MyDate());
drainMemory(); // 讓軟引用工作
}
解釋:在記憶體不足時,軟引用被終止,等同於:
MyDate date = new MyDate();
//-------------------由JVM決定運行-----------------
If(JVM.記憶體不足()) {
date = null;
System.gc();
}
//-------------------------------------------------------------
3、弱引用:
public static void main(String[] args) {
WeakReference ref = new WeakReference(new MyDate());
System.gc(); // 讓弱引用工作
}
解釋:在JVM記憶體回收運行時,弱引用被終止,等同於:
MyDate date = new MyDate();
//------------------記憶體回收運行------------------
public void WeakSystem.gc() {
date = null;
System.gc();
}
4、假象引用:
public static void main(String[] args) {
ReferenceQueue queue = new ReferenceQueue();
PhantomReference ref = new PhantomReference(new MyDate(), queue);
System.gc(); // 讓假象引用工作
}
解釋:假象引用,在執行個體化後,就被終止了,等同於:
MyDate date = new MyDate();
date = null;
//-------終止點,在執行個體化後,不是在gc時,也不是在記憶體不足時--------
http://hi.baidu.com/mynetbeans/blog/item/d72208fa8d63ac1ba9d31160.html