强引用、软引用、弱引用、虚引用 实例 及 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

猜你喜欢

转载自blog.csdn.net/qq_36364521/article/details/83414646