引用于对象

在java中一切存在都视为对象,但是我们实际操作的是对象的一个引用。

User u ; //创建一个引用

u = new User(); //将这个引用指向一个对象,就可以通过引用来操作对象

四种引用类型

在JDK1.2之后,java扩充了引用的概念,将引用分为了四种:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4 种,这 4 种引用的强度依次减弱。

强引用

我们平常使用的应用就是强引用,其特点是:
只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,而不会去回收。想要使被引用的对象能被回收,需要手动的将引用赋值为null,这样之前被引用的对象就可以被JVM回收了。

软引用

软引用是用来描述一些非必需但仍有用的对象,其特点:
在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。
其声明方法:

SoftReference<User> u = new User(); //创建一个软引用指向对象
弱引用

弱引用的引用强度比软引用要更弱,无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。

WeakReference<User> u = new User(); //创建一个弱引用指向对象
虚引用

虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收。

引用队列

引用队列(ReferenceQueue)可以与软引用、弱引用以及虚引用一起配合使用,当垃圾回收器准备回收一个对象时,如果发现它还有引用,那么就会在回收对象之前,把这个引用加入到与之关联的引用队列中去。程序可以通过判断引用队列中是否已经加入了引用,来判断被引用的对象是否将要被垃圾回收,这样就可以在对象被回收之前采取一些必要的措施。其中虚引用必须和引用队列一起使用。