强引用

只要引用存在,垃圾回收器永远不会回收

Object obj = new Object();

只有当obj这个引用被释放之后,对象才会被释放掉,这也是我们经常所用的编码形式

软引用

非必须引用,内存溢出之前进行回收,可以通过以下代码实现

Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;
sf.get(); // 当这个对象被标记为需要回收的对象时,会返回null

这时候sf是对obj的一个软引用,通过sf.get()可以获取到这个对象。
软引用可以实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,提升速度;
而当内存不足时,JVM会自动删除这部分缓存数据。

弱引用

在第二次垃圾回收时回收,可以通过以下代码实现

Object obj = new Object();
WeakReference<Object> sf = new WeakReference<Object>(obj);
obj = null;
wf.get(); // 当执行过第二次垃圾回收时,会返回null
wf.isEnQueued(); //返回是否被垃圾回收器标记为即将回收

弱引用在第二次垃圾回收时回收,短时间内通过弱引用取对应的数据,可以取到,当执行第二次垃圾回收时,将返回null。
弱引用可用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾(isEnQueued() 方法)。

ThreadLocal 中有使用到弱引用。

虚引用

垃圾回收时回收,无法通过引用取到对象,可以通过以下代码实现

Object obj = new Object();
PhantomReference<Object> sf = new PhantomReference<Object>(obj);
obj = null;
pf.get(); // 永远返回null
pf.isEnQueued(); //返回是否从内存中已经删除

虚引用是每次垃圾回收的时候都会被删除,通过虚引用的get方法返回永远为null。
可以用来检测对象是否已经从内存中删除。