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。知道有这么回事就可以。
- java学习笔记--thinking in java(一)----finalize()函数
- Thinking In Java 学习笔记(一)
- thinking in java 学习笔记(一)
- Thinking in java 学习笔记(一)
- Thinking In Java学习笔记
- Thinking in Java学习笔记
- thinking in java 学习笔记
- 《Thinking in java》学习笔记
- Thinking in Java学习笔记
- Thinking In Java学习笔记
- Thinking in Java(5)-finalize()和初始化
- 我的Thinking in Java学习笔记(一)
- thinking in java 学习笔记(一)之操作符
- 学习《Thinking in java》笔记一 【浏览器插件】
- Thinking in java学习笔记(一)--前三章
- java学习笔记1-thinking in java
- java学习笔记2-thinking in java
- java学习笔记3-thinking in java
- startActivityForResult和setResult详解
- Jsp页面取值赋值
- ubuntu 14.04 (64位)下 安装 intel fortran (ifort) 免费版
- 滚动图片
- 《Google软件测试之道》学习笔记一
- java学习笔记--thinking in java(一)----finalize()函数
- 【codevs 2070】爱情之路
- CSS3 :nth-child() 选择器
- Linux小奇妙 -- bb字符音乐播放器
- web开发之Model(jsp+javaBean)揭秘
- ASP.NET中的文件操作(文件信息,新建,移动,复制,重命名,上传,遍历)(亲测详细)
- libev教程一:libev简单入门
- Modern C++(二)Range-based for loop(基于范围的for循环)
- 【leetcode】419. Battleships in a Board【E】