【Java】【 Android】中的引用分类和使用

来源:互联网 发布:在淘宝上怎么选紫砂壶 编辑:程序博客网 时间:2024/06/05 00:23

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@52e5376aa对象进入垃圾回收流程

有以上执行结果可知:

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