finalize()方法

160 阅读1分钟

这个方法是我再看《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 frBufferedReader br确保对象被回收时,不再占用本地资源。