JAVA中的引用分为强引用,软引用,弱引用,虚引用
强引用
强引用是默认引用,当我们创建一个对象并赋给一个变量,就创建了一个强引用,当没有变量再引用这个对象,下次垃圾回收时对象就会被回收。
public static void normal() {
Integer i = new Integer(1);
System.out.println(i); // 1
i = null; // 之前被引用的对象将在下一次垃圾回收时被回收
}
SoftReference
软引用,当一对象被软引用,那么对象将被JVM尽可能的持有,直到JVM内存不足时才会被回收,适合实现缓存。
public static void soft(){
Integer i = new Integer(1);
System.out.println(i); // 1
SoftReference sr = new SoftReference(i);
System.out.println(sr.get()); // 1
i = null;
System.out.println(sr.get()); // 1
System.gc();
System.out.println(sr.get()); // 1
}
执行垃圾回收后,软引用仍然能够取得对象。
WeakReference
弱引用,当一个对象被弱引用,那么对象可能被GC回收也可能没有被回收,具体要通过Reference.get()
来判断其返回值是否为空。
弱引用就像一个被强引用的对象,变成没有变量再引用时的状态,将被GC回收。
public static void weak(){
Integer i = new Integer(1);
System.out.println(i); // 1
WeakReference wr = new WeakReference(i);
System.out.println(wr.get()); // 1
i = null;
System.out.println(wr.get()); // 1
System.gc();
System.out.println(wr.get()); // null
}
PhantomReference
虚引用,通过Reference.get()
总是返回null,所以被虚引用的对象无法再被找回。
public static void phantom(){
Integer i = new Integer(1);
System.out.println(i); // 1
ReferenceQueue<Object> refQueue = new ReferenceQueue<>();
PhantomReference pr = new PhantomReference(i, refQueue);
Reference<?> poll = refQueue.poll();
System.out.println(poll); // null
System.out.println(pr.get()); // null
i = null;
System.out.println(pr.get()); // null
}
https://stackoverflow.com/questions/3329691/understanding-javas-reference-classes-softreference-weakreference-and-phanto
https://www.reddit.com/r/learnjava/comments/3r104u/softreference_vs_weakreference_vs/
http://javaconceptoftheday.com/types-of-references-in-java-strong-soft-weak-and-phantom/
https://stackoverflow.com/questions/299659/whats-the-difference-between-softreference-and-weakreference-in-java
https://www.logicbig.com/tutorials/core-java-tutorial/gc/soft-vs-weak-ref.html