写在前面

本文隶属于专栏《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());
上一篇 下一篇