java中finalize终结方法的一些问题

转载 2013年12月03日 11:16:10
一、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、记得在重载的finalize方法中最后调用super.finalize();系统不会自动调用
四、为什么不能显示直接调用finalize方法
      如前文所述,finalize方法在垃圾回收时一定会被执行,而如果在此之前显示执行的话,也就是说finalize会被执行两次以上,而在第一次资源已经被释放,那么在第二次释放资源时系统一定会报错,因此一般finalize方法的访问权限和父类保持一致,为protected。

Java终结方法的使用(终结守卫者)

终结方法finalize()通常是不可预测的,也是很危险的,一般情况下是不必要的。- Java语言规范并不保证finalize()会被及时执行,即不确定终结方法执行时间,只规定在对象被垃圾回收之前执行...

java中finalizer终结方法学习心得

java中finalizer终结方法学习心得 最近在看java的中finalizer终结方法,也就是用来释放内存的,但这绝对和C++中的析构函数不相同 C++中的析构函数是用来回收...

7.终结方法(finalize方法)和终止方法(显示的finally)

Finalize 在实际中要避免使用终结方法:不太靠谱 类的Finalize方法,可以告诉垃圾回收器应该执行的操作,该方法从Object类继承而来。在从堆中永久删除对象之前,垃圾回收器调用该对象的...

Java性能优化(6):避免使用终结函数

终结函数通常是不可预测的,常常也是很危险的,一般情况下是不必要的。使用终结函数会导致不稳定的行为、更差的性能,以及带来移植性问题。当然,终结函数也有其可用之处的但是作为一个优秀的programer,应...

Java finalize方法使用

《JAVA编程思想》: java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。           (1).对象不一定会被回收。        (2)...

关于finalize()方法(总结)

finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,g...

java finalize方法总结、GC执行finalize的过程

java finalize方法总结、GC执行finalize的过程 分类: Java2013-10-06 16:42 73人阅读 评论(0) 收藏 举报 finalizejavaj...
  • pi9nc
  • pi9nc
  • 2013年10月07日 10:30
  • 15567

慎用Finalize方法以及Finalize方法的妙用

首先,要知道finalize方法跟c++的析构函数不一样,jvm并不保证会执行。 一、慎用finalize方法 finalize方法在什么时候被调用: 在垃圾回收的时候,某个对象要被回收的时候,会...

【翻译】finalize方法到底要干嘛

【翻译】finalize方法到底要干嘛

为什么在Java中不使用finalize()方法

我们都知道finalize()方法是回收分配给对象的内存之前调用垃圾收集器线程的基本语句。在这篇文章中,我们将会深入这个方法。 这篇文章中的章节: 1、finalize()方法不能保证执行(这个将...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java中finalize终结方法的一些问题
举报原因:
原因补充:

(最多只允许输入30个字)