Effective Java (7) - 避免终止方法
一. 基本概念
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 —— 用静态工厂方法代替构造器
本文参考 本篇文章参考自<Effective Java>第三版第一条"Consider static factory methods instead of constructor ...
- [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年出版,到现在已经将 ...
随机推荐
- 完美攻略心得之圣魔大战3(Castle Fantisia)艾伦希亚战记(艾伦西亚战记)包含重做版(即新艾伦希亚战记)
(城堡幻想曲3,纠正大家个错误哦,不是圣魔大战3,圣魔大战是城堡幻想曲2,圣魔大战不是个系列,艾伦西亚战记==艾伦希亚战记,一个游戏日文名:タイトル キャッスルファンタジア -エレンシア戦記-リニュー ...
- Jndi使用好处,与简单实例【JBOSS】
JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有 ...
- java 短信验证码===随机数
生成验证码,验证码生成 String mobile = phone;// 手机号码,多个号码使用","分割 // 生成随机6位码 String s = ""; ...
- PHP Html 弹窗,本页面弹窗子页面
echo '<script type=text/javascript>window.open("","name1","width=100, ...
- 恢复js文件在windows默认打开方式
解决办法: 运行 regedit 打开注册表编辑器,定位 "HKEY_CLASSES_ROOT" > ".js" 这一项,双击默认值将数值数据改为&quo ...
- LeetCode: Valid Palindrome [125]
[题目] Given a string, determine if it is a palindrome, considering only alphanumeric characters and i ...
- ecshop首页调用某分类下的商品|assign_cat_goods()
ecshop首页调用分类下的商品其实很简单,也有模板设置那里可以设置,不过那个只可以用cat_goods.lib,不方便,所以我想看看怎么能简单的实现ecshop首页调用分类下的商品 只需要在inde ...
- Linux命令对应的全称解释(转)
Filesystem Hierarchy Standard(FHS) /:根目录,所有的目录.文件.设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者. /bin:bin 就是二进 ...
- 解决ubuntu 14.04在显示屏电缆被拔出的问题
我是一个ubuntu14.04和win7双系统.于win在正常的网络.但在ubuntu网络连接有一直显示线被拔掉,您只能连接到无线Wi-Fi,没有有线网络. 关于这个问题,,最终找到的一种方式,这是进 ...
- Android数据库专家秘籍(七)经验LitePal查询艺术
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/40153833 经过了多篇文章的学习,我们已经把LitePal中的绝大部分内容都掌握 ...