引用类型
强引用,软引用(SoftReference), 弱引用(WeakReference),虚引用(PhantomReference)
强引用
代码中普遍存在的,类似"Object object = new Object()" 这类引用,只要强引用还存在,垃圾回收器就不会回收掉被引用的对象。
软引用 SoftReference
描述一些还有用但并非必需的对象,对于软引用关联着的对象,在系统将要发生内存溢出之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。 SoftReference 类实现软引用。
软引用对象,垃圾收集器根据内存需求自行清除这些对象。软引用最常用于实现对内存敏感的缓存。
假设垃圾收集器在某个时间点确定对象是软可达的。此时,它可以选择自动清除对该对象的所有软引用,以及对通过强引用链可访问该对象的任何其他软可访问对象的所有软引用。在同一时间或稍后的时间,它将排队那些新清除的软引用.
在虚拟机抛出 OutOfMemoryError 之前,保证所有对软可达对象的软引用都已被清除。否则对清除软引用的时间或清除对不同对象的一组此类引用的顺序没有限制。 然而,鼓励虚拟机实现偏向于清除最近创建或最近使用的软引用。
此类的直接实例可用于实现简单的缓存。 这个类或派生的子类也可以用在更大的数据结构中来实现更复杂的缓存。 只要软引用的引用对象是强可达的,即实际在使用中,软引用其最近使用的条目就不会因为保持对这些条目的强引用而被丢弃,而剩下的条目则被随意丢弃垃圾收集器。
弱引用 WeakReference
被弱引用关联的对象智能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。WeakReference类。
弱引用对象,不会阻止它们的引用对象被终结、终结和回收。 弱引用最常用于实现规范化映射。
假设垃圾收集器在某个时间点确定某个对象是弱可达的。 那时它将自动地清除对该对象的所有弱引用以及对任何其他弱可达对象的所有弱引用,通过强引用和软引用链可以从中访问该对象。 同时它将声明所有以前弱可达的对象是可终结的(finalizable)。 同时或稍后它会将那些注册到引用队列的新清除的弱引用加入队列。
虚引用 PhantomReference
虚引用也称为幽灵引用或者幻影引用,它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例,为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。PhantomReference.