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状态下就被回收了。
注:不建议使用该方法去拯救对象,运行代价高昂,不确定性很大,无法保证各个对象之间的调用顺序。
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状态下就被回收了。
注:不建议使用该方法去拯救对象,运行代价高昂,不确定性很大,无法保证各个对象之间的调用顺序。
相关文章推荐
- java笔记(一)[static和final常量&String.format()问题&Array类&finalize方法及内存回收]
- Java的内存管理1:“并不只有C++程序员关心内存回收”——Java的内存管理2:"不中用的finalize( )方法"
- .net内存回收与Dispose﹐Close﹐Finalize方法
- 简单理解Java的垃圾回收机制与finalize方法的作用
- net内存回收与Dispose﹐Close﹐Finalize方法(转)
- 编程学习笔记之java相关::内存回收原理
- java回收finalize方法的作用(编程思想)
- .net内存回收与Dispose﹐Close﹐Finalize方法2
- .net内存回收与Dispose﹐Close﹐Finalize方法
- .net内存回收与Dispose﹐Close﹐Finalize方法
- 浅谈C#内存回收与Dispose﹐Close﹐Finalize方法
- java垃圾回收机制和finalize()方法
- 浅谈C#内存回收与Dispose﹐Close﹐Finalize方法
- 浅谈C#内存回收与Dispose﹐Close﹐Finalize方法[转]
- net内存回收与Dispose﹐Close﹐Finalize方法
- .net内存回收与Dispose﹐Close﹐Finalize方法
- .NET内存回收与Dispose,Close,Finalize方法
- 浅谈C#内存回收与Dispose﹐Close﹐Finalize方法
- Java虚拟机垃圾回收(一) 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析
- 浅谈C#内存回收与Dispose﹐Close﹐Finalize方法[转]