Java四种引用类型

概述

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

虚引用一般用于跟踪对象的回收情况,以便对象被回收后做一些必要的清理工作