对象可达性
- 主流商用程序语言如java,C#等都是通过“可达性”来判断对象是否存活的。这个算法的基本思路是通过一系列的“GC Roots”对象作为起始点,从这些节点开始搜索,搜索走过的路径称为“引用链”,当一个对象到达GC Roots没有任何引用链相连时,则证明此此对象时不可用的。
Java中可作为GC Roots的对象包括下面几种
- 虚拟机栈中引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法中JNI(即一般说的Native方法)引用的对象
Java中的四种引用
- 强引用(Strong Reference)
- 软引用(SoftReference)
- 弱引用(WeakReference)
- 虚引用(PhantomReference)
强引用
也就是我们最常见的普通对象的引用,只要还有引用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰这种对象。
软引用
比强引用相对弱化,JVM
会确保在OutOfMemory
之前,清理软引用指向的对象。软引用通常用来实现内存敏感的缓存,如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉。这样就保证了使用缓存的同时,不会耗尽内存。
弱引用
比软引用更弱化,只剩弱引用关联的对象只能生存到下一次垃圾回收之前。无论内存是否足够都会回收掉。
虚引用
对对象的垃圾回收没任何影响,GC根本不考虑它。。。一般用来在被回收时接收一个系统通知。
参考
- 《深入理解JVM》3.2