1.强引用(StrongReference)
最常见的引用,实现也很简单
Object o = new Object();
特点:强引用对象是个倔脾气,在JVM停止运行时才会终止,不然就算是置为null,甚至是OOM了也不会被GC
2.软引用
先说一下为什么要使用软引用,实际工作中可能会有这样的场景:我们需要查询我们之前几分钟的时间中查询的数据,一般来说,想快速获取到这些数据的话,需要把这些数据放在内存中,然而内存容量是有限的,如果一直这样存储,显然是不行的。这个时候软引用就派上用场了,在内存空间不足的时候,软引用对象会自动被回收。
实现代码:
SoftReference obj = new SoftReference(object);
object = null;
System.gc();
obj.get();
特点:
内存充足,不回收
内存不足,回收
3.弱引用
同样的,这里我先解释一下为什么要使用弱引用。之前提到了使用软引用是为了解决OOM的问题,现在我们思考另一个场景。现在我们有一个Object o,然后将其作为key放入到HashMap中,当我们把o置为null时,o并不能被回收,因为其还被HashMap所引用,然而实际上我们已经不需要这个o了,这时候使用弱引用就能解决这个问题
实现代码:
Object obj = new Object();
WeakReference wf = new WeakReference(obj);
obj = null;
wf.get();//有时候会返回null
wf.isEnQueued();//返回是否被垃圾回收器标记为即将回收的垃圾
特点:与内存无关,当对象被置为null时,才会被GC回收。
4.虚引用
又名幻想引用,这个引用也非常好理解,这种类型的引用,不管内存是否充足,不管对象是否被置为null,只要GC,那就回收。
实现代码:
Object obj = new Object();
PhantomReference pf = new PhantomReference(obj);
obj=null;
pf.get();//永远返回null
pf.isEnQueued();//返回是否从内存中已经删除
特点:垃圾回收必定回收
用途:常用于检测对象是否从内存中删除
之前看到过一个特别有意思的总结:
强引用就像是大老婆,关系稳固
软引用就像是二老婆,可能失宠
弱引用就像是情人,关系不稳固,可能跟别人跑了
虚引用就像是女神,只能在梦里想想