判断对象是否要回收有引用计数法和可达性算法两种方式,无论哪种都离不开引用,本文将介绍Java的四种引用。
概述
在Java程序中,强引用是最常见的也是默认的。new
了一个对象,并将其指向一个变量,这个变量就成为指向该对象的一个强引用。
特点
实现方式
Object obj = new Object() //这里的obj就是一个强引用
Object obj = new Object(); // 声明强引用
SoftReference<Object> sf = new SoftReference<>(obj);
obj = null; //销毁强引用
Object obj = new Object(); // 声明强引用
WeakReference<Object> wf = new WeakReference<>(obj);
obj = null; //销毁强引用
Object obj = new Object(); // 声明强引用
ReferenceQueue phantomQueue = new ReferenceQueue();
PhantomReference<Object> pf = new PhantomReference<>(obj, phantomQueue);
obj = null;
概述
软引用是用来描述一些还有用,但非必需的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。
特点
场景
软引用通常用来实现内存敏感的缓存。比如:可以使用软引用来缓存最近使用的图片或文本,一旦内存不足,垃圾回收器就会回收这些对象,从而释放内存。
实现方式
Object obj = new Object(); // 声明强引用
SoftReference<Object> sf = new SoftReference<>(obj);
obj = null; //销毁强引用
概述
弱引用也是用来描述那些非必需对象,但是在系统GC时,只要发现弱引用,不管系统堆空间使用是否充足,都会回收掉只被弱引用关联的对象。 (但是,由于垃圾回收器的线程通常优先级很低,因此,并不一定能很快地发现持有弱引用的对象。在这种情况下,弱引用对象可以存在较长的时间。)
特点
弱引用所指向的对象,被发现就会被系统回收;
场景
实现方式
Object obj = new Object(); // 声明强引用
WeakReference<Object> wf = new WeakReference<>(obj);
obj = null; //销毁强引用
概述
所有引用类型中最弱的一个。一个对象是否有虚引用的存在,完全不会决定对象的生命周期。
特点
场景
在回收该对象之前,虚引用变量将被放入引用队列中,因此通常用于在对象被回收时执行必要的清理工作。例如:
实现方式
Object obj = new Object(); // 声明强引用
ReferenceQueue phantomQueue = new ReferenceQueue(); //须和引用队列一起使用
PhantomReference<Object> pf = new PhantomReference<>(obj, phantomQueue);
obj = null;