为什么在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 ...
随机推荐
- Java GC 日志解析
JVM 在Java应用程序优化中是不可缺少的一大重项,如何合理配置Java参数,如果验证配置参数的有效性,从GC日志中可以获得很重要的提示,以下是笔者对GC垃圾收集器默认开启的组合日志的部分的解析,希 ...
- javac使用笔记
一般写java都用的IDE,今天临时要测试一下JDK安装好没,就用了一下javac,结果各种不会用 目录 javac -help查到了有javac -sourcepath,他喵的我还以为这是查找sou ...
- Psql 安装问题
在openerp安装过程中报错: psql: could not connect to server: No such file or directory Is the server running ...
- at91 uart driver for vxworks
/* at91UART.c - AT91RM9200 serial driver */ /* Copyright 2003-2004 Coordinate Co., Ltd. */ /* Copyri ...
- 重启oracle方法一二三
startup nomount alter database mount alter database open Linux:方法1 用root以ssh登录到linux,打开终端输入以下命令: cd ...
- python ascii codec can't decode
提示错误: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 240: ordinal not in range ...
- 2015 Multi-University Training Contest 3 1006 Beautiful Set
Beautiful Set Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5321 Mean: 给出一个集合,有两种计算集合的值的 ...
- [android] AndroidManifest.xml【 manifest -> uses-permission】
在 API Level 1 时被引入 简介: 在某些情况下,你为app设置的权限将会影响到google应用商店会用何种规则来过滤你的APP. 如果你需要一个硬件相关的权限——CAMERA,googl ...
- 【BZOJ】1492: [NOI2007]货币兑换Cash(cdq分治)
http://www.lydsy.com/JudgeOnline/problem.php?id=1492 蒟蒻来学学cdq神算法啊.. 详见论文 陈丹琦<从<Cash>谈一类分治算法 ...
- 【BZOJ】1684: [Usaco2005 Oct]Close Encounter(暴力+c++)
http://www.lydsy.com/JudgeOnline/problem.php?id=1684 这货完全在考精度啊.. 比如奇葩 (llf)a/b*i (llf)(a/b*i)和(llf)( ...