强引用、软引用、弱引用、虚引用有什么区别?

简介: 本文主要介绍强引用、软引用、弱引用、虚引用

强引用、软引用、弱引用、虚引用 · 语雀 (yuque.com)

自 JDK1.2 开始,Java 提供了 4 种引用关系,以表示引用和实例对象的关系。

强引用“一直存活着”

强引用,就是我们最常见的普通对象引用。

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

Object o = new Object();

软引用“有 n 次活的机会”

在系统将要发生内存溢出异常之前,垃圾收集器会把只被软引用关联着的实例对象进行回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常(OutOfMemoryError)。


软引用通常用来实现内存敏感的缓存:

  • 如果还有空闲内存,就可以暂时保留缓存;
  • 如果内存不足,则清理掉缓存;

这样就保证了使用缓存的同时,不会耗尽内存。

SoftReference<Object> softO = new SoftReference<>(new Object());

弱引用“回收就会死亡”

被弱引用关联着的实例对象只能生存到下一次垃圾收集发生之前,当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的实例对象。


弱引用可以用来构建一种没有特定约束的关系,比如,维护一种非强制性的映射关系,如果试图获取时对象还在,就使用它,否则重现实例化。弱引用同样是很多缓存实现的选择。

WeakReference<Object> weakO = new WeakReference(new Object());

虚引用“随时可能被回收”

虚引用也称为“幽灵引用”或者“幻影引用”,虚引用是最弱的一种引用关系。

  • 在Java 8以及之前的版本中,在虚引用回收后,虚引用指向的对象才会回收。
  • 在Java 9以及更新的版本中,虚引用不会对对象的生存时间产生任何影响。

无法通过虚引用来获取一个实例对象。

虚引用主要用来跟踪对象被垃圾回收的活动,回收对象关联的资源。

在Java 8以及之前的版本中,当垃圾收集器准备回收一个实例对象时,如果发现它还有虚引用,就会在回收实例对象之前,把这个虚引用加入到与之关联的引用队列中。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动,然后断开虚引用对象的引用,虚引用被回收或者不可达,虚引用指向的对象才会回收。

Object counter = new Object();
ReferenceQueue refQueue = new ReferenceQueue<>();
PhantomReference<Object> p = new PhantomReference<>(counter, refQueue);
counter = null;
System.gc();
try {
    // Remove 是一个阻塞方法,可以指定 timeout,或者选择一直阻塞
    Reference<Object> ref = refQueue.remove(1000L);
    if (ref != null) {
        // do something
        
        ref = null;
    }
} catch (InterruptedException e) {
    // Handle it
}

参考资料

第4讲 | 强引用、软引用、弱引用、幻象引用有什么区别?

ThreadLocal 原理分析及内存泄漏演示

相关文章
|
缓存 Java 程序员
Java 中的强引用、弱引用、软引用和虚引用
引用方式内存不足时垃圾回收机制启动时其余情况强引用否否否软引用是否否弱引用是是否虚引用可能可能可能在一般的程序中,弱引用和虚引用很少会被用到,强引用天天都在用就不必我说了,在有些情况下(如资源文件很大,但并不是全部要在同一时刻使用)我们会使用软引用来代替原来的强引用,一是可以避免某些情况下产生的 OOM,此外,它可以减少程序使用的内存,加速程序的运行。
103 1
|
7月前
|
Java
【JVM】深入理解Java引用类型:强引用、软引用、弱引用和虚引用
【JVM】深入理解Java引用类型:强引用、软引用、弱引用和虚引用
522 0
|
7月前
|
缓存 Java 程序员
Java垃圾回收: 什么是强引用、软引用、弱引用和虚引用?
Java垃圾回收: 什么是强引用、软引用、弱引用和虚引用?
79 2
|
Java
JVM学习日志(八) 强引用,软引用,弱引用,虚引用
强引用,软引用,弱引用,虚引用 简述
105 0
JVM学习日志(八) 强引用,软引用,弱引用,虚引用
|
算法 Java C++
14-理解Java中的不同引用类型:强引用、软引用、弱引用和虚引用
这篇文章将深入探讨Java中的四种引用类型:强引用、软引用、弱引用和虚引用。我们将逐一解释每种引用类型的特性和用途。
120 0
14-理解Java中的不同引用类型:强引用、软引用、弱引用和虚引用
|
Java
强引用、软引用、弱引用、虚引用的区别?
强引用、软引用、弱引用、虚引用的区别?
87 0
|
Java C++
Java引用类型:强引用,软引用,弱引用,虚引用
Java引用类型:强引用,软引用,弱引用,虚引用
86 0
|
缓存 Java 关系型数据库
强引用、软引用、弱引用、幻象引用有什么区别和使用场景
强引用、软引用、弱引用、幻象引用有什么区别和使用场景
224 1
|
算法 Java
java中的强引用、软引用、弱引用、虚引用
java中将引用类型分为强引用、软引用、弱引用、虚引用。之所以要这么划分,还是为了GC时更好的对对象进行处理。因为jvm已经明确了各种引用的GC方式,所以谈四种引用最好是和GC一起聊才会有意义(个人愚见)。
150 0
|
缓存 Java
强引用,软引用,弱引用,幻象引用有什么区别?
强引用,软引用,弱引用,幻象引用有什么区别?
141 0
强引用,软引用,弱引用,幻象引用有什么区别?