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对象进入垃圾回收流程
有以上执行结果可知:
- 弱引用在对象一旦被置为空的时候,就会被垃圾回收器回收掉;
- 那弱引用还有何用呢?
- 当对象已经被引用了,因为业务需要,还需要再次引用这个对象,此时又不想对原来的对象造成任何的影响,此时就可以使用弱引用了,用完了立马被回收掉就好了。相当于一次性筷子使得,用完就丢掉了。