Java/android中的引用分类及其使用解析

强应用(Strong reference)

  • 一般形式为A a = new A();这种类型,这是最常见的一种引用方法;
  • 强引用本身存储在栈内存当中,其存储指向内存中对象的地址;
  • 只有当a = null这种情况下,即没有任何强引用再指向这个对象,垃圾回收期才会考虑将这个对象收回。

软引用(Soft Reference)

以下一段实例来讲解软引用

import java.lang.ref.SoftReference;

    public class ReferenceTest {

    public static void main(String[] args) {

    A a = new A();

    SoftReference<A> srA = new SoftReference<A>(a);

    a = null;

    if (srA.get() == null) {
        System.out.println("a对象进入垃圾回收流程");
    } else {
        System.out.println("a对象尚未被回收" + srA.get());
    }

    // 垃圾回收
    System.gc();

    if (srA.get() == null) {
        System.out.println("a对象进入垃圾回收流程");
    } else {
        System.out.println("a对象尚未被回收" + srA.get());
    }

     }
    }

    class A {

    }

以上运行结果:

1 a对象尚未被回收A@4807ccf6
    2 a对象尚未被回收A@4807ccf6

以下为对上述软引用的分析

在第一次将A = null;的时候,垃圾回收器可能还没有反应过来,所以没有将这个对象回收掉。但是强行进行垃圾回收的时候,第二次输出结果显示还是没有完成对A的垃圾回收。所以有如下结论:

  • 软引用是以强引用为参数创建的,软引用本身也是存储在栈中,通过新创建的来指向这个软引用对象
  • 何时回收
  • 当其指示没有任何的强引用对象指向其;
  • 并且当虚拟机内存不足的时候才会被垃圾回收器收回。

*因此可知:软引用延长了对象在内存中占据堆内存的时间,所以一般常用的都是软引用。

弱引用(weakReference)

实力代码和软引用类似,只是把所有软引用的地方改成弱引用。但是执行的结果如下

a对象尚未被回收A@52e5376a
a对象进入垃圾回收流程

有以上执行结果可知:

  • 弱引用在对象一旦被置为空的时候,就会被垃圾回收器回收掉;
  • 那弱引用还有何用呢?
  • 当对象已经被引用了,因为业务需要,还需要再次引用这个对象,此时又不想对原来的对象造成任何的影响,此时就可以使用弱引用了,用完了立马被回收掉就好了。相当于一次性筷子使得,用完就丢掉了。