JAVA 引用

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 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

你可能感兴趣的:(JAVA 引用)