Java中的四种引用类型(精简)

话不多说奔主题,精神抖擞就是干!

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++的同学可能会好理解一些,他就像是指向指针的指针,在这里就是引用引用的引用。你品,你细品~

欢迎看官儿们留言补充和指正,谢谢下次见!

猜你喜欢

转载自www.cnblogs.com/chenyixun/p/13162286.html