强、弱、软、虚引用

强引用:
 
强、弱、软、虚引用
e.g.
public class StrongRefenceTest {
    public  static  void  main(String[] args){
 
        Object t1 = new Object();
        Object t2 = t1;
        t1 = null;
        System.gc();
        System.out.println(t2);
    }
}
 
 
Result:
 
软引用:
强、弱、软、虚引用
 
弱引用:不管内存是否足够,一律在GC垃圾回收时,对其进行回收
e.g.
 
public class PhantomReferenceDemo {
 
    public static void main(String args[]) throws InterruptedException {
        Object o1 = new Object();
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
        PhantomReference<Object> reference = new PhantomReference<>(o1,referenceQueue);
 
        System.out.println(o1);
        System.out.println(reference.get());
        System.out.println(referenceQueue.poll());
 
        System.out.println("垃圾回收之前=====================");
        o1= null;
        System.gc();
        Thread.sleep(500);
        System.out.println(o1);
        System.out.println(reference.get());
        System.out.println(referenceQueue.poll());
        System.out.println("垃圾回收之后=====================");
    }
}
Result:
null
null
垃圾回收之前=====================
null
null
垃圾回收之后=====================
 
 
软引用或弱引用的使用场景:
强、弱、软、虚引用
 
虚引用(幽灵引用):
强、弱、软、虚引用
什么是引用队列?
 
引用队列
是,弱引用(WeakReference),软引用(SoftReference),虚引用,在垃圾回收的时候,在gc前,将对象放入到引用队列中(RefencenceQueue)。
public class ReferenceQueueDemo {
 
    public static void main(String args[]) throws InterruptedException {
        Object o1 = new Object();
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
        WeakReference<Object> reference = new WeakReference<>(o1,referenceQueue);
 
        System.out.println(o1);
        System.out.println(reference.get());
        System.out.println(referenceQueue.poll());
 
        System.out.println("垃圾回收之前=====================");
        o1= null;
        System.gc();
        Thread.sleep(500);
        System.out.println(o1);
        System.out.println(reference.get());
        System.out.println(referenceQueue.poll());
        System.out.println("垃圾回收之后=====================");
    }
}
 
result:
null
垃圾回收之前=====================
null
null
垃圾回收之后=====================
 
虚引用相比较而言,功能就是在被干掉的之前,有什么操作,即对象垃圾回收的前,给引用队列发个通知。
 
public class PhantomReferenceDemo {
 
    public static void main(String args[])  {
        Object o1 = new Object();
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
        PhantomReference<Object> reference = new PhantomReference<>(o1,referenceQueue);
 
        System.out.println(o1);
        System.out.println(reference.get());
        System.out.println(referenceQueue.poll());
 
    }
}
Result:
null
null