一. 基本概念
1. 所谓的终结方法事实上是指finalize()。
2. Java的垃圾回收机制仅仅负责内存相关清理。其它资源的清理(释放文件、释放DB连接)须要程序猿手动完毕。
3. 调用System.gc() 仅仅是建议JVM运行垃圾回收(GC)。但什么时候运行、是否要运行由JVM决定。
4. 用户能够自己调用对象的finalize方法。可是这样的调用是正常的方法调用,和对象的销毁过程无关。
5. 假设一个类实现了finalize方法,那么当JVM运行垃圾回收的时候,该方法一定会被调用。
public class C {
public static void main(String[] args) {
A a = new A();
a.b = new B();
a = null;
System.gc();
}
} class A {
B b; public void finalize() {
System.out.println("method A.finalize at " + System.nanoTime());
}
} class B {
public void finalize() {
System.out.println("method B.finalize at " + System.nanoTime());
}
}
二. finalize的运行过程
当对象不可达时。GC会推断该对象是否覆盖了finalize方法,如没有覆盖则直接将其回收,否则,若对象未运行过finalize方法,将其放入F-Queue队列,由一低优先级线程运行该队列中对象的finalize方法。
运行finalize方法完后。GC会再次推断该对象是否可达,若不可达则进行回收。否则对象“复活”。
三. JDK中代码演示样例
为防止用户忘记关闭资源,JDK中FileInputStream类中覆盖了finalize方法:
/**
* Ensures that the <code>close</code> method of this file input stream is
* called when there are no more references to it.
*
* @exception IOException if an I/O error occurs.
* @see java.io.FileInputStream#close()
*/
protected void finalize() throws IOException {
if ((fd != null) && (fd != FileDescriptor.in)) {
/* if fd is shared, the references in FileDescriptor
* will ensure that finalizer is only called when
* safe to do so. All references using the fd have
* become unreachable. We can call close()
*/
close();
}
}
四. 何时使用finalize
1. 尽量少用finalize。最好由系统管理,我们能够定义其它的方法来释放非内存资源。
2. 假设一定要用,那么能够參考FileInputStream类。在finalize检查费无论内存资源释放。
版权声明:本文博主原创文章,博客,未经同意不得转载。
Effective Java (7) - 避免终止方法的更多相关文章
-
[Effective Java]第七章 方法
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
-
Effective Java 读书笔记之六 方法
一.检查参数的有效性 1.考虑参数有哪些限制,把限制写到文档中,在方法的开头处通过显式地检查来实施这些限制. 二.必要时进行保护性拷贝 1.如果类具有从客户端得到或者返回的可变组件,类就必须考虑保护性 ...
-
Effective Java - [3. 对象通用方法]
Item 10. 若覆盖equals方法,需要遵守规则
-
Effective Java 【考虑实现Comparable接口】
Effective Java --Comparable接口 compareTo方法是Comparable接口的唯一方法.类实现了Comparable接口,表明它的实例具有内在的排序关系. 自己实现co ...
-
Effective Java 学习笔记之第七条——避免使用终结(finalizer)方法
避免使用终结方法(finalizer) 终结方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的. 不要把finalizer当成C++中析构函数的对应物.java中,当对象不 ...
-
Effective java笔记(二),所有对象的通用方法
Object类的所有非final方法(equals.hashCode.toString.clone.finalize)都要遵守通用约定(general contract),否则其它依赖于这些约定的类( ...
-
effective java —— 终结方法守卫者
目录: effective java —— 终结方法守卫者 effective java 第2章:创建和销毁对象.第7条 : 避免使用终结方法.最后的“终结方法守卫者 (finalizer guard ...
-
Effective Java 第三版——1. 考虑使用静态工厂方法替代构造方法
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
-
Effective Java 第三版——10. 重写equals方法时遵守通用约定
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
随机推荐
-
EasyUI配置和组件
首先在webcontent添加配置文件 新建静态或动态网站,在title的下面加入五个配置文件路径,注意:循序不能乱 <!-- 顺序不可以乱 --> <!-- 1.jQuery的js ...
-
arrayLen
var i;for (i = categoryList.length - 1; i >= 0; i -= 1) { var categoryValue=categoryList[i]; if ( ...
-
win10 64位 mysql安装
一.安装mysql 1.下载mysql-5.7.15-winx64.zip http://dev.mysql.com/downloads/mysql/ 2.解压缩到D:\ProgramFiles 3. ...
-
Eclipse4.6(Neon) + Tomcat8 + MAVEN3.3.9 + SVN项目完整环境搭建
软件清单 jdk-8u102-windows-x64.exe eclipse-inst-win64.exe (Eclipse4.6 Neon) apache-tomcat-8.5.5-windows- ...
-
关于git status
如果只在本地修改,还没有commit,那么用git status, 打印信息为: 如果我本地没有修改文件,就是:
-
4605 Magic Ball Game
先离线记录所有询问,然后用dfs在线记录当前节点的所有父亲结点,父亲结点分为两类,一个从左边过来,一个从右边过来,分别开一个数组. 数据需要离散化,刚开始用lower_bound写,一直wa..,用二 ...
-
2019 年 Spread.NET 产品路线图(Roadmap)
前言 | 问题背景 2018年结束了,12月是Spread.NET的重要月份.我们发布了Spread.NET 12,我们期待着 2019 年令人兴奋的新年,这是Windows Forms开发人员有史以 ...
-
【Zuul】Zuul过滤器参考资料
#https://blog.csdn.net/chenqipc/article/details/53322830#https://github.com/spring-cloud/spring-clou ...
-
面象对象设计原则之六:迪米特原则(LeastKnowledge Principle, LKP)
迪米特法则来自于1987年美国东北大学(Northeastern University)一个名为“Demeter”的研究项目.迪米特法则又称为最少知识原则(LeastKnowledge Princip ...
-
pygame学习笔记(3)——时间、事件、文字
转载请注明:@小五义 http://www.cnblogs.com/xiao* 1.运动速率 上节中,实现了一辆汽车在马路上由下到上行驶,并使用了pygame.time.delay(200 ...