写在前面
本文隶属于专栏《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());