概述
Java引用类型的概念主要是为了管理对象的生命周期而存在的,引用类型主要有四种,分别为强引用、软引用、弱引用和虚引用,其中强引用即Java的原生引用,软引用、弱引用和虚引用都需要通过一个Reference
对象来表示,Reference
对象中的referent
属性指向这个引用需要指向的对象
引用的使用
强引用
String strongReference = new String("text");
System.out.println(strongReference);
软引用
SoftReference<String> softReference = new SoftReference<>(new String("text"));
System.out.println(softReference.get());
弱引用
WeakReference<String> weakReference = new WeakReference<>(new String("text"));
System.out.println(weakReference.get());
虚引用
ReferenceQueue<Object> queue = new ReferenceQueue<>();
PhantomReference<String> phantomReference = new PhantomReference<>(new String("text"), queue);
Reference
对象的构造函数,第一个参数的值将存放到referent
属性中,为该引用需要指向的对象
引用的强弱
强引用 > 软引用 > 弱引用 = 虚引用
引用对生命周期的影响
- 关联对象的所有引用中强度最大为强引用,垃圾回收器工作时不会回收该对象
- 关联对象的所有引用中强度最大为软引用,垃圾回收器工作时在内存空间不足时会回收该对象
- 关联对象的所有引用中强度最大为弱引用或虚引用,垃圾回收器工作时会回收该对象
代表软引用、弱引用和虚引用的Reference
对象,是否被垃圾回收器回收与其referent
属性指向的对象是否已被回收无关,Reference
对象是否被回收与其它一般对象的判断一致
引用队列
软引用、弱引用和虚引用在创建Reference
对象时,在构造函数中可以传入一个ReferenceQueue
对象,这个对象是一个存放Reference
对象的队列。当软引用、弱引用和虚引用对应的Reference
对象的referent
属性所指向的对象被回收后,Reference
对象将存放到ReferenceQueue
中。通过查看ReferenceQueue
可以得知哪些软引用、弱引用、虚引用所指向的对象已经被回收
ReferenceQueue<Object> queue = new ReferenceQueue<>();
SoftReference<String> softReference = new SoftReference<>(new String("text"), queue);
虚引用的特殊性质
- 被虚引用指向的对象无法通过
get
方法取出 - 调用虚引用的构造方法时,必须传入一个
ReferenceQueue
虚引用一般用于跟踪对象的回收情况,以便对象被回收后做一些必要的清理工作
PREVIOUSSpring IoC容器简述