Java四种引用之间的区别?

  • Post author:
  • Post category:java




写在前面

本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见

100个问题搞定Java虚拟机



解答

强度对比:
强引用 > 软引用 > 弱引用 > 虚引用

强引用就是 Java 代码中类似 Object obj = new Object(); 这样的引用。
JDK1.2引入后面 3 个引用的意义在于更方便的进行垃圾回收。



补充



强引用

Java代码中最常见到的。

Object obj = new Object(); //只要obj还指向Object对象,Object对象就不会被回收
obj = null;  //一般情况下,Java 对象生命周期结束后 JVM 会自动发现无效的Java 对象并进行垃圾回收,当我们手动将对象引用指向 null,可以加速 GC 的过程

强引用只要还存在,垃圾收集器永远不会回收掉被引用的对象。

除非考虑到垃圾回收,一般情况下我们只需要使用强引用就行了。



软引用

软引用关联着的对象,生命周期持续到系统将要发生 OOM 之前。

在系统将要发生 OOM 之前,就会将会把这些对象列进回收范围之中进行第二次回收。 如果这次回收还没有足够的内存,オ会抛出 OOM 。

java.lang.ref.SoftReference类表示软引用(JDK1.2+)



使用

Object obj = new Object();
SoftReference<Object> softObj = new SoftReference<>(obj);
Object o = softObj.get();



弱引用

弱引用关联的对象生命周期持续到下一次垃圾收集发生之前。

当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。

java.lang.ref.WeakReference类表示软引用(JDK1.2+)



使用

Object obj = new Object();
WeakReference<Object> weakObj = new WeakReference<>(obj);
Object o = weakObj.get();



虚引用

虚引用是最弱的一种引用关系。

虚引用的存在,完全不会对一个对象的生存时间构成影响,但同样也无法通过虚引用来取得一个对象实例。

为一个对象关联虚引用的唯一目的就是

能在这个对象被收集器回收时收到个系统通知

虚引用要和

引用队列

一起使用。

java.lang.ref.PhantomReference类表示虚引用(JDK1.2+)



使用

ReferenceQueue<String> queue = new ReferenceQueue<>();
PhantomReference<String> phantomObj = new PhantomReference<>(new String("hello"), queue);
System.out.println(phantomObj.get());



版权声明:本文为Shockang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。