可达性分析算法和 Java 中的引用

通过可达性分析(Reachability Analysis)可以判断对象是否存活,这个算法的基本思想是通过一系列称为 " GC Roots " 的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连(即 GC Roots 到这个对象不可达)时,则证明此对象是不可用的。

即使在可达性分析算法中不可达的对象,也并非是 “ 非死不可 ” 的,要真正宣告一个对象死亡,至少要经历两次标志过程。一次是可达性分析不可达,另一次是对象没有必要执行 finalize() 方法或者在 finalize() 方法中对象无法再与引用链上的任何一个对象重新建立起关联。

如果一个对象是可达性分析中不可达对象,但是它在执行 finalize() 方法(前提是对象觉得有必要执行,并且仅有一次执行的机会)的时候与引用链上的任何一个对象重新建立起关联,那么这个对象就还可以存活。

Java 中的引用可以分为 强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference) 4 种,这四种引用的强度依次逐渐减弱。

强引用

强引用在程序代码中普遍存在,类似 “ Object obj  =  new Object( ) ” 这类的引用,只要强引用还存在,垃圾收集器就永远不会回收掉被引用的对象。

软引用

软引用是一些还有用但并非必需的对象。在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。

弱引用

弱引用也是用来描述并非必需的对象。但是被弱引用关联的对象只能生存到下一次垃圾收集发生之前,无论内存足不足够,当垃圾收集器工作时,这些对象都会被回收。

虚引用

虚引用是最弱的一种引用关系。一个对象是否存在虚引用完全不会对其生存时间构成影响,为一个对象设置虚引用关联的唯一目的是能在这个对象在垃圾收集器回收时收到一个系统通知。

猜你喜欢

转载自blog.csdn.net/weixin_41163113/article/details/86764910