6.10.4 对象的软引用 弱引用和虚引用
6.10.4 对象的软引用 弱引用和虚引用
对大部分对象而言,程序里会有一个引用变量引用该对象,这是最常见的引用方式。除此之外,java.lang.ref
包下提供了3个类: SoftReference
、 PhantomReference
和WeakReference
,它们分别代表了系统对对象的3种引用方式:软引用、虚引用和弱引用。因此,Java
语言对对象的引用有如下4种方式。
1. 强引用(StrongReference)
这是Java
程序中最常见的引用方式。程序创建一个对象,并把这个对象赋给一个引用变量,程序通过该引用变量来操作实际的对象,此时这引用变量就是强引用
。
前面介绍的对象和数组都采用了这种强引用的方式。当一个对象被一个或一个以上的引用变量所引用时,它处于可达状态,不可能被系统垃圾回收机制回收。
2. 软引用(SoftReference)
软引用需要通过SoftReference
类来实现.
当一个对象只有软引用时,它有可能被垃圾回收机制回收。对于只有软引用的对象而言,
- 当系统内存空间足够时,它不会被系统回收,程序也可使用该对象;
- 当系统内存空间不足时,系统可能会回收它。
软引用通常用于对内存敏感的程序中。
3. 弱引用(WeakReference)
弱引用通过Weak Reference
类实现。
弱引用和软引用很像,但弱引用的引用级别更低。对于只有弱引用的对象而言,当系统垃圾回收机制运行时
,不管系统内存是否足够,总会回收该对象所占用的内存。
当然,并不是说当一个对象只有弱引用时,它就会立即被回收。只有弱引用的对象必须等到系统垃圾回收机制运行时
才会被回收。
4. 虚引用(PhantomReference)
虚引用通过PhantomReference
类实现。
虚引用完全类似于没有引用。虚引用对 对象本身没有太大影响,对象甚至感觉不到虚引用的存在。如果一个对象只有一个虚引用时,那么它和没有引用的效果大致相同。虚引用主要用于跟踪对象被垃圾回收的状态,虚引用不能单独使用
,虚引用必须和引用队列
(ReferenceQueue
)联合使用。
如何获取被引用的对象
上面三个引用类都包含了一个get()
方法,用于获取被它们所引用的对象。
引用队列
引用队列由java.lang.ref.ReferenceQueue
类表示,它用于保存被回收后对象的引用。
软引用和弱引用在回收之后被放入引用队列
当联合使用软引用
、弱引用
和引用队列
时,系统在回收被引用的对象之后
,将把被回收对象对应的引用添加到关联的引用队列中。
虚引用在对象是否之前被放入引用队列
与软引用和弱引用不同的是,虚引用在对象被释放之前
,将把它对应的虚引用添加到它关联的引用队列中,这使得可以在对象被回收之前采取行动。
虚引用不能单独使用
软引用和弱引用可以单独使用,但虚引用不能单独使用,单独使用虚引用没有太大的意义。
虚引用主要用来跟踪对象是否即将被回收
虚引用的主要作用就是跟踪对象被垃圾回收的状态,程序可以通过检查与虚引用关联的引用队列中是否已经包含了该虚引用,从而了解虚引用所引用的对象是否即将被回收。
这篇文章还没有读完,还有写例子没有看,我跑过去学习按键精灵了,现在没有心情继续看下去,先看下一篇,后面有空再来补上。