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. AD域 组策略部署U软件

    1.首先把需要部署的软件放到活动目录共享文件夹中.(只支持MSI格式的软件) 2.打开组策略管理工具. 3.选择域名右键,创建GPO. 4.在弹出的新建GPO窗口中,输入策略名称. 5.在新创建的策略 ...

  2. 企业BGP网络规划案例(四)

    关于路由的发布和接收使用route-map过滤,防止本AS作为一个转发区域. 在XRV3上和XRV4上使用prefix-list 进行路由接搜和发布的过滤 XRV3配置 =============== ...

  3. Python校验文件MD5值

    import hashlib import os def GetFileMd5(filename): if not os.path.isfile(filename): return myHash = ...

  4. zabbix学习笔记----安装----2019.03.26

    1.zabbix官方yum源地址:repo.zabbix.com 2.安装zabbix server zabbix server使用mysql作为数据库,在zabbix 3.X版本,安装zabbix- ...

  5. jinji2

    ---恢复内容开始--- part1 %d 十进制整数输出              int %f 浮点数(小数点后六位)float %c 单个字符输出                  char % ...

  6. MySQL 的几种进入方式

    对于码农一族来说,新入手电脑后,工具安装,环境搭建是为必备功课.环境搭不好工具装不全,后续的工作开展那就会有相当多的痛点,也会耗去相当多的时间和精力.近日,博主在安装 Mysql 数据库的过程中,一番 ...

  7. python websocket 再线聊天室的 Demo

    服务端 import tornado.web import tornado.ioloop import tornado.httpserver import tornado.options import ...

  8. Vue 获取元素样式 元素高度

    看到这个问题我第一时间想的竟然是JS 不知道你是怎么想的 不过昨天有一个小哥哥 问我一个Vue的 哈哈哈 get了 我当时问他为什么不用JS获取 他说 这个性能更高 那我们来看看这个高性能的获取元素高 ...

  9. java之servlet学习基础(二)

    上一次写到Servlet的实现方法,主要还是通过继承HttpServlet来实现Servlet.下面主要是回顾一下HttpServletRequest和HttpServletResponse对象中的一 ...

  10. Spring Cloud的小改进(五)

    1.在Eureka中不能看到具体服务的实例信息: 问题点:服务注册到 Eureka 之后,可以看到在 “Status” 显示的服务信息不明确(不知道具体的服务名等信息),如下图所示: 解决方法: 在服 ...