深入理解java的finalize

深入理解java的finalize

ID:32567650

大小:102.75 KB

页数:4页

时间:2019-02-12

深入理解java的finalize_第1页
深入理解java的finalize_第2页
深入理解java的finalize_第3页
深入理解java的finalize_第4页
资源描述:

《深入理解java的finalize》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、深入理解java的finalize  2010-10-0819:18:32

2、  分类: Java语法、语言特 

3、  标签:finalize  gc  对象  reachable  queue  

4、字号 订阅目录 基本预备相关知识 对象的销毁过程 对象重生的例子 对象的finalize的执行顺序 何时及如何使用finalize 参考 基本预备相关知识 1java的GC只负责内存相关的清理,所有其它资源的清理必须由程序员手工完成。要不然会引起资源泄露,有可能导致程序崩溃。 2调用GC并不保证GC实际执行。 3finalize抛出的未捕获异常只会导致该对象的finalize执行退出。

5、 4用户可以自己调用对象的finalize方法,但是这种调用是正常的方法调用,和对象的销毁过程无关。 5JVM保证在一个对象所占用的内存被回收之前,如果它实现了finalize方法,则该方法一定会被调用。Object的默认finalize什么都不做,为了效率,GC可以认为一个什么都不做的finalize不存在。 6对象的finalize调用链和clone调用链一样,必须手工构造。 如 Java代码 1.protected void finalize() throws Throwable {  2.    super.finalize();  3.}  对象的销毁过程 在对象的销

6、毁过程中,按照对象的finalize的执行情况,可以分为以下几种,系统会记录对象的对应状态: unfinalized没有执行finalize,系统也不准备执行。 finalizable可以执行finalize了,系统会在随后的某个时间执行finalize。 finalized该对象的finalize已经被执行了。 GC怎么来保持对finalizable的对象的追踪呢。GC有一个Queue,叫做F-Queue,所有对象在变为finalizable的时候会加入到该Queue,然后等待GC执行它的finalize方法。 这时我们引入了对对象的另外一种记录分类,系统可以检查到一个对象属

7、于哪一种。 reachable从活动的对象引用链可以到达的对象。包括所有线程当前栈的局部变量,所有的静态变量等等。 finalizer-reachable除了reachable外,从F-Queue可以通过引用到达的对象。 unreachable其它的对象。 来看看对象的状态转换图。  好大,好晕,慢慢看。 1首先,所有的对象都是从Reachable+Unfinalized走向死亡之路的。 2当从当前活动集到对象不可达时,对象可以从Reachable状态变到F-Reachable或者Unreachable状态。 3当对象为非Reachable+Unfinalized时,GC会把它

8、移入F-Queue,状态变为F-Reachable+Finalizable。 4好了,关键的来了,任何时候,GC都可以从F-Queue中拿到一个Finalizable的对象,标记它为Finalized,然后执行它的finalize方法,由于该对象在这个线程中又可达了,于是该对象变成Reachable了(并且Finalized)。而finalize方法执行时,又有可能把其它的F-Reachable的对象变为一个Reachable的,这个叫做对象再生。 5当一个对象在Unreachable+Unfinalized时,如果该对象使用的是默认的Object的finalize,或者虽然重

9、写了,但是新的实现什么也不干。为了性能,GC可以把该对象之间变到Reclaimed状态直接销毁,而不用加入到F-Queue等待GC做进一步处理。 6从状态图看出,不管怎么折腾,任意一个对象的finalize只至多执行一次,一旦对象变为Finalized,就怎么也不会在回到F-Queue去了。当然没有机会再执行finalize了。 7当对象处于Unreachable+Finalized时,该对象离真正的死亡不远了。GC可以安全的回收该对象的内存了。进入Reclaimed。 对象重生的例子 Java代码 1.class C {  2.    static A a;  3.}  4.

10、  5.class A {  6.    B b;  7.  8.    public A(B b) {  9.        this.b = b;  1.    }  2.  3.    @Override  4.    public void finalize() {  5.        System.out.println("A finalize");  6.        C.a = this;  7.    }  8.}  9.  10.class B {  11.    St

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。