话不多说奔主题,精神抖擞就是干!
1. 在JDK1.2之后引入了强、软、弱、虚引用这四个概念。
2. 强引用
Object obj = new Object();
这个obj就是"="式后面那个对象的强引用,也是我们常用的引用。
*要点:在任何时候都不会被JVM GC回收掉,在JVM内存溢出后直接OOM。
3. 软引用
用途:对于可能会被经常访问到的数据采用软引用,提高查询效率,但是如果不需要的时候又需要GC主动去回收掉。
Object obj = new Object();
SoftRefence<Object> sr = new SoftRefence<>(obj);
obj = null;
obj = sr.get(); //返回这个对象的强引用,但有时候会返回Null
*要点:在JVM内存快要溢出时GC回收掉。
4. 弱引用
相较软引用保存时间更短
Object obj = new Object();
WeakReference<Object> wr = new WeakReference<>(obj);
obj = null;
obj = wr.get(); //返回这个对象的强引用,但有时候会返回Null
boolen eq = wr.isEnQueued(); //返回是否即将被GC回收器回收的标记
*要点:在JVM第二次GC时回收掉。
5. 虚引用
Object obj = new Object();
PhantomReference<Object> pr = new PhantomReference<>(obj);
obj = null;
obj = pr.get(); //永远返回Null
boolen eq = pr.isEnQueued(); //返回是否被GC回收器回收的标记
6. 结合引用队列使用
软、弱、虚引用都可以结合引用队列使用,下面以软引用为例:
Object obj = new Object();
ReferenceQueue<Object> queue = new ReferenceQueue<>();
SoftReference sr = new SoftReference(object, queue); //绑定对象和引用队列
obj = null;
SoftReference val = null;
while ((val = queue.poll()) != null) {
//处理逻辑
}
*要点:
强引用 对象 弱引用
sr ---> new SoftReference ---> obj
当软引用所引用的对象被GC回收掉以后,那么软引用对象本身会被加入到与它绑定引用队列中去。
我们知道,当你引用的对象被GC回收掉以后,那你new SoftReference出来的(引用)对象本身是不是已经没有存在的价值了,
但是它仍被你的sr强引用着,无法被GC回收掉,这个时候需要我们的程序添加处理逻辑。
如果有学过C++的同学可能会好理解一些,他就像是指向指针的指针,在这里就是引用引用的引用。你品,你细品~
欢迎看官儿们留言补充和指正,谢谢下次见!