为什么在Java中不使用finalize()方法
我们都知道finalize()方法是回收分配给对象的内存之前调用垃圾收集器线程的基本语句。在这篇文章中,我们将会深入这个方法。
这篇文章中的章节:
1、finalize()方法不能保证执行(这个将要用例子来说明)
2、其他不使用它的原因
3、finalize()方法在性能上增加负担
4、正确使用的指导
finalize()方法不能保证执行(这个将要用例子来说明)
- public class TryCatchFinallyTest implements Runnable {
- private void testMethod() throws InterruptedException
- {
- try
- {
- System.out.println("In try block");
- throw new NullPointerException();
- }
- catch(NullPointerException npe)
- {
- System.out.println("In catch block");
- }
- finally
- {
- System.out.println("In finally block");
- }
- }
- @Override
- protected void finalize() throws Throwable {
- System.out.println("In finalize block");
- super.finalize();
- }
- @Override
- public void run() {
- try {
- testMethod();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- public class TestMain
- {
- @SuppressWarnings("deprecation")
- public static void main(String[] args) {
- for(int i=1;i<=3;i++)
- {
- new Thread(new TryCatchFinallyTest()).start();
- }
- }
- }
- Output:
- In try block
- In catch block
- In finally block
- In try block
- In catch block
- In finally block
- In try block
- In catch block
- In finally block
很神奇,线程中的finalize方法一点也没有执行,这已经证明了我刚刚说明的事情。我想发生这件事的原因是:finalizer是由垃圾收集器中的独立线程控制执行的,如果Java虚拟机存在太久,垃圾回收器没有时间创建和执行finalizers,如果错了,请说明。
- public class TestMain
- {
- @SuppressWarnings("deprecation")
- public static void main(String[] args) {
- for(int i=1;i<=3;i++)
- {
- new Thread(new TryCatchFinallyTest()).start();
- Runtime.runFinalizersOnExit(true);
- }
- }
- }
- Output:
- In try block
- In catch block
- In finally block
- In try block
- In try block
- In catch block
- In finally block
- In catch block
- In finally block
- In finalize block
- In finalize block
- In finalize block
还有另一个方法,Runtime.getRuntime().runFinalization(); 但是这只能保证GC做出最大的努力,即使在我们的程序中,我们也不能保证3个线程中的finalize方法都能执行。
其他不使用它的原因
finalize()方法在性能上增加负担
正确使用的指导
- @Override
- protected void finalize() throws Throwable
- {
- try{
- //release resources here
- }catch(Throwable t){
- throw t;
- }finally{
- super.finalize();
- }
- }
为什么在Java中不使用finalize()方法的更多相关文章
- JAVA中GC时finalize()方法是不是一定会被执行?
在回答上面问题之前,我们一定要了解JVM在进行垃圾回收时的机制,首先: 一.可达性算法 要知道对象什么时候死亡,我们需要先知道JVM的GC是如何判断对象是可以回收的.JAVA是通过可达性算法来来判断 ...
- finalize() 方法——Java中垃圾回收提醒方法
finalize() Java 允许定义这样的方法,它在对象被垃圾收集器析构(回收)之前调用,这个方法叫做 finalize( ),它用来清除回收对象. 例如,你可以使用 finalize() 来确保 ...
- 【Java面试题系列】:Java中final finally finalize的区别
本篇为[Java面试题系列]第三篇,文中如有错误,欢迎指正. 第一篇链接:[Java面试题系列]:Java基础知识常见面试题汇总 第一篇 第二篇链接:[Java面试题系列]:Java基础知识常见面试题 ...
- java中substring的使用方法
java中substring的使用方法 str=str.substring(int beginIndex);截取掉str从首字母起长度为beginIndex的字符串,将剩余字符串赋值给str: str ...
- Java中Set的contains()方法
Java中Set的contains()方法 -- hashCode与equals方法的约定及重写原则 翻译人员: 铁锚 翻译时间: 2013年11月5日 原文链接: Java hashCode() a ...
- [java,2017-05-16] java中清空StringBuffer的方法以及耗费时间比较
java中清空StringBuffer的方法,我能想到的有4种: 1. buffer.setLength(0); 设置长度为0 2. buffer.delete(0, buffer.length() ...
- java中BorderLayout的使用方法
相关设置: 使用BorderLayout布局上下左右中布局5个按键,单击中间的那个按键时就关闭窗口 代码: /**** *java中BorderLayout的使用方法 * 使用BorderLayout ...
- 【Java】Java中常用的String方法
本文转载于:java中常用的String方法 1 length()字符串的长度 String a = "Hello Word!"; System.out.println(a.len ...
- Java中Set的contains()方法——hashCode与equals方法的约定及重写原则
转自:http://blog.csdn.net/renfufei/article/details/14163329 翻译人员: 铁锚 翻译时间: 2013年11月5日 原文链接: Java hashC ...
随机推荐
- 省市联动js代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 复现IIS6.0远程命令执行漏洞
出这个漏洞有一定时间了,一直没测试,因为知道这个漏洞有条件的,好吧,顺便感谢royal大佬今天晚上日内网的指点. 漏洞要求: 开启Webdav PS:不想刚拿下的内网服务器一下权限掉了,又不想放xx远 ...
- [初学WPF]控件大小自适应
想在Win上自己写点小工具用,GUI自然是免不了的,于是决定学一学WPF,直接拖控件是很方便啊.控件拖出来以后发现运行时改变窗口大小控件不会重绘,搜索了一下发现了解决办法:使用Viewbox控件. V ...
- zabbix监控数据库
Zabbix通过percona监控MySQL 因为Zabbix自带的MySQL监控没有提供可以直接使用的Key,所以一般不采用,业界的同学们都使用Percona Monitoring Plugin ...
- jQuery补充,模拟图片放大镜
jQuery补充,模拟图片放大镜 html <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- debugging openstack with pdb
在要开始debug的地方导入pdb: class KeypairAPI(base.Base): """Sub-set of the Compute Manager API ...
- LoadRunner Error code 10053,Software caused connection abort
发现问题的应用场景 C/S结构程序,请求响应采用异步机制.即客户端发送一个请求后不是一直等待这个结果,客户端将请求存放在请求队列并获得一个JOBID,服务器运行后将运行结果存放在响应队列,客户端定时 ...
- [转]这五种方法前四种方法只支持IE浏览器,最后一个方法支持当前主流的浏览器(火狐,IE,Chrome,Opera,Safari)
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- LED音乐频谱之概述
点击打开链接 转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/37929733 这个LED音乐频谱是我在学51单片机的 ...
- Spring_day03--Spring配置c3p0连接池和dao使用jdbcTemplate
Spring配置c3p0连接池和dao使用jdbcTemplate 1 spring配置c3p0连接池 第一步 导入jar包 第二步 创建spring配置文件,配置连接池 原始方式 (1)把代码在配置 ...