您的位置:首页 > 编程语言 > Java开发

java内存回收之finalize()方法原理

2017-02-18 19:22 204 查看
确认对象已死亡:1、引用计数算法:算法原理是 给每个对象中添加一个引用计数器,每当有地方引用它时,计数器值就加1,当引用失效时,计数器值就减1;任何时候计数器值为0的对象就是不可能再被使用的。

2、可达性分析算法 :原理是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为引用链(reference Chain),当一个对象到GC Roots没有任何引用链相连的时候,则证明该对象是不可用的。

在Java语言中,可以做GC Roots的对象的有:

1、虚拟机 栈中引用的对象

2、方法区中类静态属性引用的对象

3、方法区中常量引用的对象

4、本地方法栈中JNI(一般而言的Native方法)引用的对象。

即使在可达性分析算法中不可达的对象,也并非是“非死不可”的,真正宣告一个对象死亡,至少要经历两次标记过程:如果对象在进行可达性分心后没有发现与GC roots相连接的引用链,那么它会被第一标记并进行一次筛选,筛选条件是此对象是否有必要执行finalize()方法,当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过(任何一个对象的finalize()方法都只会 被系统自动调用一次),虚拟机将这两种情况视为”没有必要执行“。则该对象基本上就真的被回收了。

若该对象被判定为有必要执行finalize()方法,那么该对象会被放置在一个叫做F-Queue的队列中,并在稍后由一个由虚拟机自动建立的,低优先级的Finalizer线程去执行它(所谓”执行“就是触发该方法,并不承诺会等待它运行结束)。finalize()方法是对象逃脱死亡命运德最后一次机会,稍后GC 将对F-Queue中的对象进行第二次小规模的标记,如果对象要在finalize()中拯救自己-----只要重新与引用链上的任何一个对象建立3关联即可,eg:把自己(this)赋值给某个类变量或者对象的成员变量,那么第二次标记的时候他将被移除

”即将回收“的集合;如果没能在finalize()方法中拯救自己,那么基本上 它就真的被回收了。 



状态含义:

              Reachable:表示GC Roots引用可达(即有引用链相连)

              Finalize Reachable(F-reachable):不是Reachable,但通过某个finalizable对象可达

              Unreachable:表示该对象不可达(到GC Roots 没有任何引用链相连)

              Unfinalized:GC未执行该对象的finalze()方法,该对象可达

              Finalzable:GC可以对该对象执行finalize()方法,GC检测该对象不可达,GC通过F-Queue队列执行finalize()方法

              Finalized:GC已经对该对象执行过finalize()方法,

 图中A-->B:对象没有override finalize()方法,在Unreachable状态下就被回收了。

注:不建议使用该方法去拯救对象,运行代价高昂,不确定性很大,无法保证各个对象之间的调用顺序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: