强、弱、软、虚引用
强引用:
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