最近学了下关于对象是否存活方面的知识,我老是觉得有些知识明明看完还挺明白的,但是过了几天再看就跟看新东西一样。故写一写,记一记。
引用计数法和可达性分析算法皆是判断对象是否存活的算法。
引用计算法:为对象设置一个计数器,设值为0。若有地方引用它时,计数器加1,结束引用时减1。判断值是否为0,若为0说明该对象没有被引用,会被判定为可回收对象;若不为0说明该对象被引用,不会回收。优点:实现简单,且效率高。不足:难处理循环引用的情况
可达性分析算法:GC root为起点开始收索,该路径称为引用链。当存在对象到GC root没有引用链时,说明当前对象不可用。判定为可回收对象。可达性分析算法的可回收对象还有存活的可能性!!!
该对象会进行第一次判断,看是否有必要执行finalize()方法,如果对象没有覆盖finalize()方法或者finalize()方法被虚拟机调用过,该对象会被视为"没必要执行",会被回收。若第一次判断通过被视为”有必要执行“,该对象被放进F-Queue队列里面,虚拟机自动生成一个finalizer线程去触发fianlize()方法,如果对象在触发方法的过程中连接上了引用链,则该对象不会被回收,否则会被回收。
不对之处,望指出