绵阳高端网站建设,手机微信公众号怎么开通,wordpress 小程序,河南建筑官网首页1.标记阶段的目的
主要是在GC在前#xff0c;判断出哪些是有用的对象#xff0c;哪些是需要回收的对象#xff0c;只有被标记为垃圾对象#xff0c;GC才会对其进行垃圾回收。判断对象是否为垃圾对象的两种方式#xff1a;引用计数算法和可达性分析算法。
2.引用计数算法…1.标记阶段的目的
主要是在GC在前判断出哪些是有用的对象哪些是需要回收的对象只有被标记为垃圾对象GC才会对其进行垃圾回收。判断对象是否为垃圾对象的两种方式引用计数算法和可达性分析算法。
2.引用计数算法(现在不再使用)
引用计数算法实现相对比较简单就是给每一个对象保存一个引用计数器记录此对象被引用的次数。只有该对象的引用次数为0才表示该对象不在被使用即可回收。
优点便于实现回收及时判定效率高。
缺点 因为要有引用计数器所以需要额外的空间。 每次的操作都要个计数器重新赋值所以需要额外的时间。 (重点)无法处理循环引用的问题比如说外部P引用了A而A引用了BB又引用了CC又引用了A那么对于ABC其计数器为211那么此时如果外部引用P赋值为null及无外部引用了但是ABC计数器依然为1无法被回收常此就会出现内存泄露。 3.可达性分析算法(也称为根搜索算法、追踪性垃圾收集)
可达性算法可以解决循环引用的问题其思路为以根为起始点向下搜索存活的对象就是与根直接或者间接相连的对象所搜索经过的路径称为引用链如果未被搜索到则表明不可达就标记为垃圾对象。 那么要作为根的判断标准是什么呢 虚拟机栈中引用的对象(如局部变量...)。 方法区中类的静态变量。 被同步锁synchronized持有的对象。 Java虚拟机内部的使用。
4.对象的finalization机制
finalize()方法机制是指对象被回收前由GC调用的方法只会调用一次Java提供了对象被销毁前允许开发人员来自定义销毁前要做的事情finalize()方法是Object类中的方法此方法内没有任何的实现开发人员可以重写该方法。不要主动的去调用finalize()方法。因为 finalize()方法可以使对象不在被销毁在临死前拉一把。 如果不发生GCfinalize方法是没有执行机会的。 一个糟糕的finalize()可能会使程序崩溃比如里面自定义一个死循环。
5.由于finalize()对象的三种状态 可触及的及可从根到达此对象。 可复活的对象被标记为垃圾但是可能在finalize()方法中被拯救。 不可触及的对象的finalize()方法被调用了并且没有复活。
具体的过程一个对象要被回收要经历两次标记的过程如果此对象没有任何的引用则会被标记为垃圾对象等待回收在回收前执行该对象的finailze()方法如果没有重写该方法对象就会为不可触及状态被清理如果重写了该方法则会被加入到队列中由一个Finalizer低优先级的线程来执行如果在方法中没有补救那么第二次标记就会标记该对象将会彻底被回收清理如果在finalize()方法中对象又建立了联系那么此对象又会进入可触及的状态如果又没有了引用finalize()方法不会在被调用(只会调用一次)对象直接会变为不可触及的状态。