欢迎来到天天文库
浏览记录
ID:32567650
大小:102.75 KB
页数:4页
时间:2019-02-12
《深入理解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
此文档下载收益归作者所有