在JDK1.2以前的版本中,若一个对象不被任何变量引用,则程序就无法再使用这个对象。从JDK1.2版本开始,把对象的引用分为4种级别,从而使程序能够更加灵活的控制对象的生命周期。这4种级别由高到低依次为Strong Reference(强引用)、Soft Reference(软引用)、Weak Reference(弱引用)、Phantom Reference(虚引用)。
1. Strong Reference
一般情况下强引用是使用最普遍的引用,若内存中的对象具有强引用时,即使内存不足,宁可抛出异常OOM使程序终止,垃圾回收器也不会回收它;若内存中的对象不再有任何强引用时,则垃圾回收器开始考虑可能要对此内存进行垃圾回收。
2. Soft Reference
软引用可用于实现内存敏感的高速缓存,也可以和一个引用队列(ReferenceQueue)联合使用。当一个对象只具有软引用时,如果内存空间足够,则垃圾回收器就不会回收它;如果内存空间不足,则垃圾回收器就会回收该对象的内存。如果软引用所引用的对象被垃圾回收器回收,则Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
3. Weak Reference
与软引用相比,弱引用具有更短暂的生命周期,在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间是否足够,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。
弱引用可以和一个引用队列联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
4. Phantom Reference
顾名思义,虚引用就是形同虚设,主要用于跟踪对象被垃圾回收器回收的活动。与其他几种引用不同的是,虚引用并不会决定对象的生命周期,并且必须与引用队列联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收前采取必要的行动。
在Android应用的开发中,为了防止内存溢出,在处理一些占用内存大而且声明周期较长的对象时,可以尽量应用软引用和虚引用。