首先看类的结构图:
它是在java.lang.ref包下 从上面的单词就知道了Reference是引用的意思,前面的前缀就是所说的软 弱 虚引用,我们通常都是使用强引用,
Person person = new Person();
Java默认就是强引用,比如上面的new Peson对象,
当内存不足, jvm开始垃圾回收,对于强引用的对象,就算出现OOM异常也不会对该对象进行回收,Android内存泄露大部分都是强引用导致的,
Object object1 = new Object();
Object object2 = object1;
object1 = null;
System.gc();
System.out.println("object2="+object2);
虽然把object1=null,然后object2还是存在,
软引用是相对强引用弱点的引用,需要使用SoftReference类来实现,当系统内存充足时,它不会被回收,当系统内存不足时,它会被回收,软引用通常使用在对内存比较敏感时使用
Object object1 = new Object();
SoftReference
从上面的代码虽然我把object1=null了,但是从软引用中获取的对象还是不为null,这就是证明了在内存足够时候,不会回收,我把内存配置成了10m
Object object1 = new Object();
SoftReference
这个时候会报:
这就证明了内存不足时候,会回收软引用的对象
弱引用需要用WeakReference来实现,它比软引用的生存期更短.不管内存是否够用,只要gc扫描到它都会被回收.代码演示:
Object object1 = new Object();
WeakReference
虚引用是使用PhantomReference类实现,做了这么多年开发 没用到过,不知道它的使用场景在哪里,如果一个对象仅持有虚引用,
那么它就和没任何引用一样,在任何时候都有可能被垃圾回收, 它不能单独使用也不能通过它访问对象,虚引用必须配合ReferenceQueue一起使用,虚引用的作用主要是跟踪对象被垃圾回收的状态,
这个类的作用就是对象被垃圾回收后会存放到引用队列中,
Object object1 = new Object();
ReferenceQueue referenceQueue = new ReferenceQueue();
WeakReference
结果:
回收前获取引用队列中的对象null
回收后获取引用队列中的对象java.lang.ref.WeakReference@610455d6
就写到这里吧!