java finalize学习

Posted 梁子领域

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java finalize学习相关的知识,希望对你有一定的参考价值。

1 finalize()调用的时机

与C++的析构函数(对象在清除之前析构函数会被调用)不同,在Java中,由于GC的自动回收机制,因而并不能保证finalize方法会被及时地执行(垃圾对象的回收时机具有不确定性),也不能保证它们会被执行(程序由始至终都未触发垃圾回收)。

2 为什么应该避免使用它

首先,由于finalize()方法的调用时机具有不确定性,从一个对象变得不可到达开始,到finalize()方法被执行,所花费的时间这段时间是任意长的。我们并不能依赖finalize()方法能及时的回收占用的资源,可能出现的情况是在我们耗尽资源之前,gc却仍未触发,因而通常的做法是提供显示的close()方法供客户端手动调用。
另外,重写finalize()方法意味着延长了回收对象时需要进行更多的操作,从而延长了对象回收的时间。





例:
当强制gc的时候,finalize方法中有类的调用则不会打印这句话
public class Finallize {
boolean checkout = false;
Finallize(boolean checkout){
checkout = checkout;
}
Finallize(){}

void checkIn(){
checkout = false;
}

@Override
protected void finalize(){
if(checkout){
Utils.print(String.format("%d","check out"));
}

try {
super.finalize();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}


public static void main(String[] args) {
Finallize finallize = new Finallize();
finallize = null;
System.gc();
}
}

以上是关于java finalize学习的主要内容,如果未能解决你的问题,请参考以下文章

Java学习笔记之三十三详解Java中try,catch,finally的用法及分析

异常和TCP通讯

2.Java异常学习

Java学习笔记3.6.2 final关键字 - final修饰方法

Java学习笔记3.6.3 final关键字 - final修饰变量

Java学习笔记3.6.1 final关键字 - final修饰类