JVM 中的四种引用分别是:强引用、软引用、弱引用和虚引用。这四种引用用来表示 Java 对象与引用对象之间的关系。
1、强引用:是最常见的引用方式,通常情况下,只要强引用还存在,垃圾回收器永远不会回收它所引用的对象。
示例代码如下:
Object obj = new Object();
2、软引用:是用来描述一些还有用但非必需的对象,在内存不足时,这种对象将被垃圾回收器回收。
示例代码如下:
Object obj = new Object();
SoftReference<Object> softRef = new SoftReference<Object>(obj);
3、弱引用:比软引用更加弱一些,它描述的是非必需对象,当垃圾回收器执行时,无论内存是否充足,都会回收这种对象。
示例代码如下:
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<Object>(obj);
4、虚引用:是最弱的引用,仅仅提供了一种确定对象被垃圾回收器回收的途径。虚引用与其他引用的区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。
示例代码如下:
Object obj = new Object();
ReferenceQueue<Object> refQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(obj, refQueue);
四种引用的作用是用来控制对象被垃圾回收的时机。
1、强引用(Strong Reference):强引用是最常见的引用,它是一种普通的引用,在程序执行过程中不会对引用对象造成回收。只要有强引用指向一个对象,它就永远不会被回收。
2、软引用(Soft Reference):当内存空间不足时,系统会回收这些对象。当系统回收后,这些对象就是不可到达的。
3、弱引用(Weak Reference):弱引用与软引用类似,当垃圾回收器进行回收时,无论内存是否足够,都会回收这些对象。
4、虚引用(Phantom Reference):虚引用是最弱的引用,它不会对对象的生存时间造成影响,也不能单独使用来取得对象的实例。虚引用必须和 ReferenceQueue 联合使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的 ReferenceQueue 中。