finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。 
特殊情况下,需要程序员实现finalize,当对象被回收的时候释放一些资源,比如:一个socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize,关闭这个链接。 
使用finalize还需要注意一个事,调用super.finalize();

一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。 
所以,推荐不要使用finalize()方法,它跟析构函数不一样。

1.object定义 
protected void finalize() //定义为子类可见

2.执行时机不可预知 
当一个对象变得不可触及时,垃圾回收器某个时期会回收此对象。 
当回收对象之前会调用finalize方法,这类似于人类临终之前必须做一件事情:写遗言。 
因为GC是不确定性的(这跟JVM相关),所以finalize方法的执行具有不可预知性。

3.finalize忽略异常 
即finalize代码中若出现异常,异常会被忽略

4.finalize使用 
什么时候使用?一般来说,finalize被作为第二种安全网来使用,如FileInputStream类, 
当对象回收时,有可能资源为释放,所以这里第二次来确认(那也总比不释放强吧,虽然具体释放时机未定)

protected void finalize() throws IOException {
if (fd != null) {
if (fd != fd.in) {
close();
}
}
}

注意:某些用到finalize的地方,你必须像如下所示,显式调用回收链。

protected void finalize() throws IOException {
try{
...
}finally{
super.finalize();
}
}

5.<\effective java>建议:尽量不要使用finalize,除非以它作为安全网,或是为了终结非关键的原生资源。

总结起来finalize()方法可以这样记忆:

  Object类定义;执行不可预知,忽略异常,一般做第二安全网

参考地址:http://caizi0413.iteye.com/blog/845727 
https://segmentfault.com/q/1010000000094660

finalize方法的使用的更多相关文章

  1. 禁止使用finalize方法

    Don´t use Finalizers, mainly because are unpredictable and we don´t know when will be executed, &quo ...

  2. 第五节:什么导致Finalize方法被调用

    Finalize方法在垃圾回收结束时被调用,下面有5种事件会导致开始垃圾回收 1.第0代已满    第0代已满,垃圾回收会自动开始.该事件是目前导致Finalize方法被调用的最常见的一种方式,因为虽 ...

  3. Java中finalize方法用途何在?

    package thinking.in.java.demo; /* * finalize的用途何在? * *本例的终止条件是L所有的Book对象在被当做垃圾回收前都应该被签入.但是在main方法中 * ...

  4. Java 声明和访问控制(三) finalize方法 成员访问修饰符

    finalize()方法是Object类的一个方法,在垃圾回收器执行的时候,会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源的回收,例如文件关闭等. 成员访问修饰符: 默认访问:包访问 ...

  5. JAVA中的finalize()方法

    [转]JAVA中的finalize()方法 今天早上看Thinking in java的[第四章 初始化和清除].[  清除:终结和垃圾回收]的时候, 看到了这个东西. 用于清理滴... 当然,这个方 ...

  6. Java基础--finalize()方法

    原理: 一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并在下一次垃圾回收动作发生时,才会真正回收对象占用的内存. 用途: 1)释放通过某种创建对象方式以外的方式为对 ...

  7. Java对象中的finalize()方法使用说明

    我在写java程序的时候,从来没有遇见过是用Object.finalize()的时候,但是在学习Java虚拟机的垃圾回收机制时,虚拟机在进行垃圾回收时需要使用finalize()方法来进行对象清理.下 ...

  8. java的finalize()方法与C++的析构函数

    ---<java编程思想> 读书笔记 --- 2017/3/15 读<java编程思想>读到初始化与清理一章,文中提及java的finalize()方法,联想到了C++的析构函 ...

  9. Java finalize方法使用

    <JAVA编程思想>: Java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize(). (1).对象不一定会被回收. (2).垃圾回收不是析构函数. ( ...

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

    注:本文的目的并不是鼓励使用finalize方法,而是大致理清其作用.问题以及GC执行finalize的过程. 1. finalize的作用 finalize()是Object的protected方法 ...

随机推荐

  1. 使用syslog服务器存储cp防火墙日志配置

    版本:R80.20 step1:创建syslog 服务器,如下图: step2:配置syslog 服务器,如下图:   step3:配置网关日志服务器,添加设定的syslog服务器,如下图:   st ...

  2. Checkbox的只读设置

    readonly和disabled属性均不生效.可按如下方式处理,记得引入jquery.js文件 <input type="checkbox" name="chk& ...

  3. java关于get/post请求

    package com.study.test; import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu ...

  4. SUBMIT WITHOUT ALV

    data:seltab type table of rsparams, seltab_wa like line of seltab. define add_seltab. if &1 is n ...

  5. SpringCloud微服务基础

    1.传统项目架构  传统项目分为三层架构,将业务逻辑层.数据库访问层.控制层放入在一个项目中.适合于个人或者小团队开发,不适合大团队开发. 2.分布式项目架构(解耦方案) 根据业务需求进行拆分成N个子 ...

  6. Python播放、关闭音乐代码

    1.安装pygame:win + r :打开控制台输入:pip install pygame 2.#导入 import time import pygame 3.设置音乐绝对路径 #音乐路径 file ...

  7. Oracle lag()/lead() over()分析函数

    with tmp as(select '1' id ,'aa' name ,'22' age from dual union allselect '2' id ,'bb' name ,'20' age ...

  8. Springmvc中@RequestMapping 属性用法归纳

    简介: @RequestMapping RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. RequestM ...

  9. linux awk使用详解

    转载:https://www.cnblogs.com/xudong-bupt/p/3721210.html   awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的 ...

  10. 201621123002《java程序设计》第十二周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何 ...