java四种引用总结

对象可达性

  • 主流商用程序语言如java,C#等都是通过“可达性”来判断对象是否存活的。这个算法的基本思路是通过一系列的“GC Roots”对象作为起始点,从这些节点开始搜索,搜索走过的路径称为“引用链”,当一个对象到达GC Roots没有任何引用链相连时,则证明此此对象时不可用的。

    Java中可作为GC Roots的对象包括下面几种

  1. 虚拟机栈中引用的对象
  2. 方法区中类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法中JNI(即一般说的Native方法)引用的对象

Java中的四种引用

  1. 强引用(Strong Reference)
  2. 软引用(SoftReference)
  3. 弱引用(WeakReference)
  4. 虚引用(PhantomReference)

强引用

也就是我们最常见的普通对象的引用,只要还有引用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰这种对象。

软引用

比强引用相对弱化,JVM会确保在OutOfMemory之前,清理软引用指向的对象。软引用通常用来实现内存敏感的缓存,如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉。这样就保证了使用缓存的同时,不会耗尽内存。

弱引用

比软引用更弱化,只剩弱引用关联的对象只能生存到下一次垃圾回收之前。无论内存是否足够都会回收掉。

虚引用

对对象的垃圾回收没任何影响,GC根本不考虑它。。。一般用来在被回收时接收一个系统通知。

参考

  1. 《深入理解JVM》3.2