強引用、軟引用、弱引用、虛引用 例項 及 gc回收後的自救
阿新 • • 發佈:2018-12-31
package com.sgcc.test;
import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
public class test {
public static void main(String[] args) throws InterruptedException {
//強引用
Object obj = new Object();
Object objr;
//可直接通過obj取得對應的物件 如
if(obj.equals(objr = new Object()))System.out.println(123);
obj = null;
Runtime.getRuntime().gc();
System.out.println(objr);
//軟引用
Object obj1 = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj1);
obj1 = null;
Runtime.getRuntime().gc();
System.out.println(sf.get());//有時候會返回null
//弱引用
Object obj2 = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj2);
obj2 = null;
Runtime.getRuntime ().gc();
System.out.println(wf.get());
//虛引用
Object obj3 = new Object();
final ReferenceQueue q = new ReferenceQueue();
PhantomReference<Object> pf = new PhantomReference<Object>(obj3, q);
Thread t = new Thread(){
@Override
public void run() {
// TODO Auto-generated method stub
try {
Reference reference = q.remove();
System.out.println(reference + " event fired.");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
super.run();
}
};
t.setDaemon(true);
t.start();
obj3=null;
//Runtime.getRuntime().gc();
System.gc();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("pf.get: "+pf.get() +" isEnqueued"+ pf.isEnqueued());//返回是否從記憶體中已經刪除
}
}
//gc回收後的自救
package com.sgcc.test;
public class FinalizeEscapeGC {
public String name;
public static FinalizeEscapeGC SAVE_HOOK = null;
public FinalizeEscapeGC(String name) {
this.name = name;
}
public void isAlive() {
System.out.println("yes, i am still alive :)");
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("finalize method executed!");
System.out.println(this);
FinalizeEscapeGC.SAVE_HOOK = this;
}
@Override
public String toString() {
return name;
}
public static void main(String[] args) throws InterruptedException {
SAVE_HOOK = new FinalizeEscapeGC("leesf");
System.out.println(SAVE_HOOK);
// 物件第一次拯救自己
SAVE_HOOK = null;
System.out.println(SAVE_HOOK);
System.gc();
// 因為finalize方法優先順序很低,所以暫停0.5秒以等待它
Thread.sleep(500);
if (SAVE_HOOK != null) {
SAVE_HOOK.isAlive();
} else {
System.out.println("no, i am dead : (");
}
// 下面這段程式碼與上面的完全相同,但是這一次自救卻失敗了
// 一個物件的finalize方法只會被呼叫一次
SAVE_HOOK = null;
System.gc();
// 因為finalize方法優先順序很低,所以暫停0.5秒以等待它
Thread.sleep(500);
if (SAVE_HOOK != null) {
SAVE_HOOK.isAlive();
} else {
System.out.println("no, i am dead : (");
}
}
}