在Java中,引用类型是一个非常重要的概念,它们决定了对象的生命周期和垃圾回收的行为。理解不同的引用类型不仅有助于优化内存管理,还能帮助开发者编写更高效和健壮的代码。本文将详细介绍Java中的几种引用类型,包括强引用、软引用、弱引用和虚引用,并探讨它们的应用场景和使用方法。

Java里面的几种引用类型

Java 引用的定义

java 中,引用变量实际上是一个指针,它指向的是堆内存中对象实例。 引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。

引用存放在栈中,对象存放在堆中。

引用队列 ReferenceQueue

ReferenceQueue,它用于保存被回收后对象的引用。一个对象被回收后,就会往引用队列的队尾插入一个对象的引用。

程序可以通过判断引用队列中是否已经加入引用,来了解被引用的对象是否被 GC 回收。

强引用

当一个对象持有强引用时,JVM 无论如何都不会去回收这个对象,宁愿抛出出 OutOfMemoryError(内存溢出错误 OOM)

强引用使用不当可能会导致内存泄漏

软引用 SoftReference

当一个对象持有软引用时,如果内存空间足够,在 GC 时,就不会回收;内存空间不够了,GC 时就会回收软引用对象

弱引用 WeakReference

当一个对象持有弱引用时,不管内存空间是否足够,GC 回收弱引用的对象,Android 中内存比较紧张,常常使用弱引用(比软引用使用得更多)来实现缓存。

因为图像占用的内存比较多,有多张图片缓存的话,就可能内存不够 OOM

这时使用软引用来保存内存中的 Bitmap 对象,可以避免 OOM 的发生(因为系统在内存不够的使用会回收 Bitmap 对象)

虚引用 PhantomReference

虚引用(形同虚势)它的作用在于跟踪垃圾回收过程,为了被虚引用关联的对象在被垃圾回收器回收时,能够收到一个系统通知。

不能够通过虚引用的 Get 方式来得到所指向的对象。