1、强引用(StrongReference)

最常见的引用方式。一般你通过new产生的都是强引用。

如果对象在GC引用链上是可达的,就一定不会被垃圾回收。

缺点:
如果使用通常的强引用,强引用本身会使得对象一直存留在内存中,这样就使得程序员必须自己决定什么时候移除缓存中的引用,这样对象才能被垃圾回收机制回收。

2、软引用(SoftReference)

内存不足时就会强制被GC,内存足的时候和强引用效果一样(即认为是存在引用关系,在引用链上可达,不会被GC)

适用场景:作为缓存比较合适,让JVM自动管理对象生命周期

3、弱引用(WeakReference)

弱引用对象在GC ROOT上是不可达的,不会干扰原来引用对象被GC。当弱引用的对象需要被回收了,则会进行GC。

例如:两个引用指向同一个对象,一个强一个弱。强的没了,弱的在适当时候也会被回收

4、虚引用(PhantomReference)

虚引用就是最“没用”的引用,你创建了虚引用,但是确不能通过虚引用get到对象。当然,他在GC-ROOT上也是不可达的。

作用:配合引用队列(Reference Queue)来跟踪要被GC的对象,在GC前做一些清理工作。

5、引用队列(Reference Queue)

虚引用和弱引用对象都可以配合引用队列是用,但是注意差别:

  1. 虚引用:在对象销毁之后才加入引用队列。这是JAVA唯一知道对象何时被真正销毁的方法,即配合虚引用和引用队列。虚引用保证了对象不会被重生,使得对象析构更加安全高效
  2. 弱引用:在对象销毁之前加入引用队列,可以在真正销毁前做一些清理工作

6、总结

Java4种引用的级别由高到低依次为:

强引用 > 软引用 > 弱引用 > 虚引用

参考资料:
http://www.importnew.com/14115.html