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年出版,到现在已经将 ...
随机推荐
- Android Fragment使用
通常地 fragment做为宿主activity UI的一部分, 被作为activity整个view hierarchy的一部分被嵌入. 有2种方法你能够加入一个fr ...
- 怎样从host之外连接到docker container
启动docker的时候的指令使用 sudo docker -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock -d & 这样就能使dock ...
- JS经常使用正則表達式【分享】
工作中JS经常使用表达式: 1)2010-09-10类型日期校验 2)推断正整数.字符串长度 3)校验长度,和是否空 4)推断字符串是否为空 5)比較字符大小 6)推断字符串长度 7)推断格式是否为E ...
- 教你pomeloclient包libpomelo增加cocos2d-x 3.0工程(Windows、Android、IOS平台)
Windows平台 操作系统:Windows7(64-bit) VS版本号:2013 Cocos2d-x版本号:3.0 project路径:E:\cocos2d-prj\ 1.从github下载lib ...
- 一个测试SQL2005数据库连接JSP档
在这里,在SQL 2005中间InterLib数据库案例.得到InterLib/tb_booktype目录. 的影响,如下面的: watermark/2/text/aHR0cDovL2Jsb2cuY3 ...
- Windows Phone开发(2):竖立自信,初试锋茫
原文:Windows Phone开发(2):竖立自信,初试锋茫 上一篇文章中,我们聊了一些"大炮"话题,从这篇文章开始,我们一起来学习WP开发吧. 一.我们有哪些装备. 安装完VS ...
- 广域网佰腾玩O2O笑话——它看起来很漂亮,注定不低于
据说 2014.8.29:中国最大的商业运营商万达在一起的互联网服务供应商百度.腾讯在深圳(属性)战略合作签约仪式举行. 从功能表面上.万达代表实体,百度代表数据.腾讯代表社区:按三个合伙人理解,是要 ...
- 使用LabVIEWPC的制备
使用LabVIEWPC的制备 1.下载.安装LabVIEW 如今,互联网搜索,你可以搜索出一大推LabVIEW下载并安装破解教程.因此,这里没有具体描述的.请自行百度~~.另外.提醒一下,下载LabV ...
- 怎样配置nginx同一时候执行不同版本号的php-fpm
在/usr/local/php/etc/php-fpm.conf里找到 listen = 127.0.0.1:9000 将port9000改动为9001 在对应的nginx配置里也做相同的port改动
- #Windows Phone:在HTML5专案中,如何从Javascript传送字串到C#的APP端
原文:#Windows Phone:在HTML5专案中,如何从Javascript传送字串到C#的APP端 #Windows Phone:在HTML5专案中,如何从Javascript传送字串到C#的 ...