java finalize的一些问题
来源:互联网 发布:美国电话号码格式 知乎 编辑:程序博客网 时间:2024/06/11 13:13
一、finalize的作用
由于在java中存在垃圾回收器,因此许多人认为它相当于C++中的析构函数,然而,垃圾回收器只会回收使用new方法获得的内存,而通过其他方法得到的内存以及任何其他系统资源(比如文件句柄、数据库连接等)都不能通过垃圾回收器得到释放。因此我们需要其它的释放函数。那么能够做到这一切的是finalize()方法(但是,一定不要使用finalzie方法去释放这些资源)。finalize方法的工作原理“假定”是这样的:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用finalize()方法,并在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。因此,如果有一些需要释放的资源,可以讲释放语句写在finalize方法中,它们将在垃圾回收器工作时自动得到执行。那么,为什么不能使用该方法去释放资源呢?
二、为什么尽量避免使用finalize函数
首先,finalize()一定会被执行,但是并不总是那么及时,原因有二:
1、垃圾回收器并不总是工作,只有当内存资源告急时,垃圾回收器才会工作;
2、即使垃圾回收器工作,finalize方法也不一定得到执行,这是由于程序中的其他线程的优先级远远高于执行finalize()函数线程的优先级。
因此,当finalize还没有被执行时,系统的其他资源,比如文件句柄、数据库连接池等已经消耗殆尽,造成系统崩溃。
第二,如果一种未被捕获的异常在使用finalize方法时被抛出,这个异常不会被捕获,finalize方法的终结过程也会终止,造成对象出于破坏的状态。
第三,第二种情况已经是一种特例,还有其他的情况也会造成对象不会被销毁,从而浪费内存。
第四,垃圾回收和finalize方法的执行本身就是对系统资源的消耗,有可能造成程序的暂时停止,因此在程序中尽量避免使用finalize方法。
三、finalize函数的应用场景
1、当对象的使用者忘记显示释放使用资源的时候,finalize函数充当安全网的角色,相当于最后一道防火墙(祈祷finalize方法能够被及时执行);
2、释放本地方法申请的非关键资源(程序中嵌入的其他语言申请的非关键资源,关键资源仍然要显示释放);
3、终结条件(java编程思想88页)
PS:记得在重载的finalize方法中最后调用super.finalize();系统不会自动调用
四、为什么不能显示直接调用finalize方法
如前文所述,finalize方法在垃圾回收时一定会被执行,而如果在此之前显示执行的话,也就是说finalize会被执行两次以上,而在第一次资源已经被释放,那么在第二次释放资源时系统一定会报错,因此一般finalize方法的访问权限和父类保持一致,为protected。
二、为什么尽量避免使用finalize函数
三、finalize函数的应用场景
四、为什么不能显示直接调用finalize方法
0 0
- java finalize的一些问题
- java finalize的一些问题
- java中finalize终结方法的一些问题
- java finalize
- JAVA垃圾收集器finalize()方法的一些总结
- java关于final,finally和finalize的一些理解
- 【java】finalize的用途
- 关于java的finalize
- java--finalize()的学习
- 谈谈final, finally, finalize的区…
- java List 的倒序问题
- 深入理解java的finalize
- Java中finalize()的用法
- 深入理解java的finalize
- java的finalize方法详解
- java finalize方法的使用
- 深入理解java的finalize
- 深入理解java的finalize
- mysql warnings 和整数越界
- 面试失败后各国青年的不同反…
- java初学者应该注意的问题
- python 面向对象详解
- java基础程序题 判断一个字符串是否为回文 运用正则表达式处理字符串
- java finalize的一些问题
- 垃圾收集器与Java编程(转载)
- Weex和Web开发体验的异同
- 5 Great Graduation Speech Quotes
- MySql 常用命令
- 日期计算
- 模式匹配 正则表达式的应用
- 使用1个以上的表
- 在批处理模式下使用mysql