android的四种引用

强引用:普通new对象的引用

User user = new User();

jvm宁愿抛出OutOfMemory异常也不会去回收该对象

软引用

SoftReference引用的装饰的对象,该对象的强引用应该赋值空

这里配合ReferenceQueue使用(也可以不配合),因为SoftReference本身也是new了一个对象

当他把别人的问题解决掉以后,也需要把自己的问题解决,所以当jvm把软引用

对象回收后,就会把自己的对象引用放到这个队列中,我们可以通过队列的poll()

方法查看,如果存在该ReferenceQueue,那么就说明该对象的软引用对象已经被jvm

回收,我们需要将该ReferenceQueue引用也赋值为空,等待被jvm回收。

注意:软引用对象是在jvm内存不够的时候才会被回收,我们调用System.gc()方法只是

起通知作用,jvm什么时候扫描回收对象是,是jvm自己的状态决定的。就算扫描到软引用

对象也不一定会回收它。只有内存不够的时候才会回收

ReferenceQueue queue = new ReferenceQueue();

User user = new User();

SoftReference ref=new SoftReference(user, queue);

user=null;

弱引用:弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,只要扫描到,

无论内存是否充足(与软引用的区别),都会回收被弱引用关联的对象。在java中,

用java.lang.ref.WeakReference类来表示

WeakReference sr = new WeakReference(new User());

System.out.println(sr.get());

System.gc(); //通知JVM的gc进行垃圾回收,但是之前使用的时候调用这个,下边输出不为null,暂时原因未明

System.out.println(sr.get());

虚引用

虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。

在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,

则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。

要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,

如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。

程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。

如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

ReferenceQueue queue = new ReferenceQueue();

PhantomReference pr = new PhantomReference(new User(), queue);

System.out.println(pr.get());//但是之前使用的时候调用这个,下边直接报错,暂时原因未明

你可能感兴趣的:(android的四种引用)