1. 程式人生 > >強引用、軟引用、弱引用、虛引用 例項 及 gc回收後的自救

強引用、軟引用、弱引用、虛引用 例項 及 gc回收後的自救

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 : (");
        }
    }
}

參考文章地址:https://www.cnblogs.com/yw-ah/p/5830458.html