finalize关键字和垃圾回收的一些知识
2015-11-05 16:21
197 查看
1.finalize()方法
1)finalize()的工作原理:假定一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收时候做一些重要的清理工作。2)JAVA中的对象并非总是被垃圾回收:
a)垃圾可能不被垃圾回收
b)垃圾回收并不等于“析构”
c)垃圾回收只与内存有关
使用垃圾回收的唯一原因是为了回收程序不再使用的内存,所以对于与垃圾回收有关的任何行为来说,它们也必须同内存及其回收有关。
2.如何进行的垃圾回收
1)引用计数法:是一种简单但是速度很慢的垃圾回收技术。每个对象都含有一个引用计数器,当有引用连接到对象时,引用计数加1.当引用离开作用域或被置为null时,引用计数减1.虽然管理引用计数的开销不大,但是这开销需要在整个程序的生命周期中将持续发生,垃圾回收器会在含有全部对象的列表上遍历,当发现某个对象的引用计数为0时,就释放其占用的空间。这个方法也有缺陷,如果对象之间存在循环引用,可能会出现“对象应该被回收,但是引用计数却不是0”的情况。对于垃圾回收器而言,定位这样的交互自引用的对象组所需的工作量极大。引用计数常用来说明垃圾收集的工作方式,但似乎未被应用到任何一种java虚拟机实现中。2)根搜索算法:
通过假定的一个root开始搜索,沿着每条引用搜索,如果该对象到root不可达,此时该对象就会被垃圾回收。
3.一些更快的模式中,垃圾回收并非基于引用计数技术。他们依据的思想是:对任何“活”的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用。这个引用链条可能会穿过数个对象层次。由此,如果从堆栈或者静态存储区开始,遍历所有的引用,就能找到所有“活”的对象。对于发现的每个引用,必须追踪他所引用的对象,然后是此对象包含的所有引用,访问过的对象必须都是“活”的。这就解决了“交互自引用的对象组”的问题(这种现象根本不会被发现,因此也就被自动回收了)。
4.Java虚拟机中有许多附加的技术用来提升速度。尤其是与加载器操作有关,被称作为"即时"编译器的技术。这种技术可以吧程序全部或部分翻译成本地机器码,程序的运行速度因此得到了提升。当需要装在某个类时,编译器会先找到其.class文件,然后将该类的字节码装入内存,此时有两种方案可以供选择。一种是让即时编译器编译所有的代码,这种做法有两个缺陷:这种动作散落在整个程序的生命周期内,累加起来花更多的时间;并且会增加可执行代码的长度,这将导致页面调度,从而降低程序速度。另外一种做法是惰性评估,即时编译器只在必要的时候才去编译代码。这样,从不会被执行的代码也许就压根不会被JIT所编译。
相关文章推荐
- 如何进行shell脚本正确性测试
- 银行家算法:解决多线程死锁问题
- 统计字符串中字符的个数
- sipXecs技术交流QQ群
- python 服务器清除日志文件
- MYSQL数据库备份与恢复
- 安卓引入library后R文件无法生成
- 测试方法------白盒测试简介
- 下载文件+保存到SD卡 --归纳整理 MARS ANDROID 课堂笔记
- IOS UILabel的一些使用小技巧
- iOS消息推送相关
- JQuery - MD5加密
- 葫芦娃团队
- 电子类产品生产经验总结
- Andriod技术开发前景与“钱”景哪个更重要
- 二叉堆-选择排序
- PHP抓取百度贴吧邮箱v1.0
- linux下 安装php的gettext模块
- extmail搭建
- 每日一命令 ls