java学习笔记--thinking in java(一)----finalize()函数

来源:互联网 发布:用跳蛋是什么体验知乎 编辑:程序博客网 时间:2024/05/18 01:12

1. 首先,从今天开始,我会陆续写一些java的学习笔记,主要是回头再看基础,有了一定自己的理解,就写出来供自己以后复习用。也希望如果有错误能有人帮我指出来。

2. finalize是Object类的方法,所以所有的类都可以直接调用。写之前先说一句,那就是finalize并没有什么用。下面会写,其实看完thinking in java,深入理解java虚拟机以及网上的资料之后,就是一句话,没事别用finalize,有事用了也不一定起作用。之所以没有用还学,感觉是可以深入理解一下gc机制。

3. 首先从gc机制说起。目前的jvm一般都用可达性分析来确定需要回收的对象。所谓可达性分析就是根据栈去和常量区的引用,然后找到对象进行标记并根据对象内部的引用再次寻找,知道完全标记。然后剩下的没有标记的就是所谓没有用的对象了。对这些对象进行标记。

4. 对没有引用的对象进行标记是为了回收。当然,也许为了卖个萌,jvm会给这些对象一个机会,一个转死回生的机会,就是在调用gc前一刻,会调用这些对象的finalize函数。记住,每个对象一生只有这么一次免死的机会。一次用过了,就会标记,下次就不会再调用finalize了,直接gc.当然,说免死不合适。

5. 因为finalize有一个特性,就是包治但是不包治好。也就是大家都可以用这次机会,但不一定起作用。所以,不一定是免死,也可能只是挣扎一下。

6. 如果在一个对象调用自己的finalize函数,又为自己找到了引用(当然,是引用指向对象),那么他就不用死了,死而复生。除了不能再用finalize,其他和新创建的类没有区别。很多展示gc和展示finalize的程序都是在类里面覆写的finalize函数里面把此对象赋给引用(借助于this),这样下面的gc就不会回收了。

7. 至此,就可以明白finalize的作用了,他是gc为了保险而在大开杀戒之前的一个核对。但是,System.gc是不一定会发送gc的,发生了也不一定会调用finalize函数。所以才说不确定。

8,这也是另一个问题,就是不要用fianlize。因为不确定的东西,没法用。当然,可以作为一个补充,用来关闭资源。这也是finalize的最大用处之一。但是,还是不要这样用为好。

9. 其实finalize就是一个本来系统用的工具,很复杂很强大,但是我们用户太弱用不了,相当于无用。Thinking in java上反复强调的一句话,尽量不要用finalize。知道有这么回事就可以。


0 0
原创粉丝点击