这个方法是我再看《On Java 8》中关于垃圾回收器的部分看到的一个方法。这个方法说实话没什么用。
这个方法和垃圾回收器有一点关系,当垃圾回收器准备回收对象占用的内存时,会先标记该对象,并调用其中的finalize()方法,并在下一轮的垃圾回收中,才真正的回收该对象。
所以finalize()方法的唯一作用就是,在对象被清理前,做一些重要的清理工作。
通过new关键字创建的对象都会被垃圾回收器回收,如果创建的对象不是通过new关键字来创建的呢?
比如读取一个本地文件,调用一些本地方法,占用本地资源。 这些本地资源需要我们通过手动释放,完成清理工作。
这时候finalize()方法就排上用场了,当该对象正在调用本地资源时,如果该对象被标记,下一轮就会回收,我们就可以通过finalize()来安全的关闭被调用的本地资源。
class File {
private String pathname = "D:\\Code\\Demo\\Test\\src\\file.txt";
FileReader fr;
BufferedReader br;
{
try {
fr = new FileReader(pathname);
br=new BufferedReader(fr);
String line;
while ((line=br.readLine())!=null){
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void finalize() throws Throwable {
fr.close();
br.close();
System.out.println("回收");
}
}
class Demo{
public static void main(String[] args) {
while (true){
File file=new File();
}
}
}
输出:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
.............
............
回收
回收
回收
ABCDEFGHIJKLMNOPQRSTUVWXYZ
回收
回收
使用while(true)死循环后,对象不停的创建,到内存快满的时候垃圾回收器才开始工作,我们在finalize()方法里关闭FileReader fr和BufferedReader br确保对象被回收时,不再占用本地资源。