finalize应用
来源:互联网 发布:seo关键词优化软件 编辑:程序博客网 时间:2024/06/07 19:45
一、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。
由于在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。
0 0
- finalize应用
- 方法finalize()的应用
- 方法finalize()的应用
- 方法finalize()的应用
- 方法finalize()的应用
- finalize
- finalize()
- finalize
- finalize
- finalize
- finalize
- finalize()
- finalize
- finalize()
- finalize()
- Android Studio安装应用时报错 installation failed with message Failed to finalize session......
- Dispose & Finalize
- finalize是什么
- C语言控制cpu使用率
- OC中的反射机制
- Hibernate @Transient
- NSDictionary--字典
- hibernate的<class name=" " table=" " schema=" "> 中schema的问题
- finalize应用
- EularProject 7: 计算10001个素数
- HDU 1162 Prim
- HDU4312 Meeting point-2 (切比雪夫距离&&曼哈顿距离)
- 身为码农,为12306说两句公道话
- NSMutableDictionary--可变字典
- c# Form之间进行值传递问题(参考)
- 公式编辑器mathtype中一些符号显示方框的解决方法
- c++学习