弱引用(weak reference)
  弱引用(weak reference)在强度上弱于软引用,通过类 WeakReference来  表示。它的作用是引用一个对象,可是并不阻止该对象被回收。假设使用一个强引用的话。仅仅要该引用存在。那么被引用的对象是不能被回收的。
  弱引用则没有这个问题。
  在垃圾回收器执行的时候,假设一个对象的全部引用都是弱引用的话,该对象会被回收。
  弱引用的作用在于解决强引用所带来的对象之间在存活时间上的耦合关系。弱引用常见的用处是在集合类中,尤其在哈希表中。
  哈希表的接口同意使用不论什么Java对象作为键来使用。当一个键值对被放入到哈希表中之后。哈希表  对象本身有了对这些键和值对象的引用。
  假设这样的引用是强引用的话,那么仅仅要哈希表对象本身还存活,当中所包括的键和值对象是不会被回收的。假设某个存活  时间非常长的哈希表中包括的键值对非常多,终于有可能消耗掉JVM中所有的内存。对于这样的情况的解决的方法是使用弱引用来引用这些对象,这样哈希表中的键和值对象都能被垃圾回收。
  Java中提供了 WeakHashMap来满足这一常见需求。
  虚引用(phantom  reference)
  在介绍虚引用之前,要先介绍Java提供的 对象终止化机制(finalization)。在Object类里面有个 finalize方法,其设计的初衷是在一个对象被真正回收之前,能够用来执行一些清理的工作。由于 Java并没有提供类似 C++的析构函数一样的机制,通过finalize方法来实现。
  可是问题在于垃圾回收器的执行时间是不固定的,所以这些清理工作的实际执行时间也是不能预知的。虚引用(phantom  reference)能够解决问题。在创建虚引用 PhantomReference的时候必需要指定一个引用队列。当一个对象的finalize方法已经被调用了之后。这个对象的虚引用会被增加到队列中。
  通过检查该队列里面的内容知道一个对象是不是已经准备要被回收了。
  在有些情况下。程序会须要在一个对象的可达到性发生变化的时候得到通知。比方某个对象的强引用都已经不存在了,仅仅剩下软引用或是弱引用。
  可是还须要对引用本身做一些的处理。典型的情景是在哈希表中。引用对象是作为WeakHashMap中的键对象的。当其引用的实际对象被垃圾回收之后。须要把该键值对从哈希表中删除。有了引用队列(ReferenceQueue),能够方便的获取到这些弱引用对象,将它们从表中删除。
  前软而弱引用对象被添加到队列。其引用实际的对象会被清空主动。
  通过参考队列 poll/remove该方法可以是非堵塞和的方式堵塞分别得到一个引用队列对象。