使用finalize()方法让对象进行自救

demo代码:

import java.util.concurrent.TimeUnit;

public class ObjectHelpSelf {
    private static ObjectHelpSelf objectHelpSelf = null;

    @Override
    protected void finalize() throws Throwable {
        System.out.println("进入finalize方法中,对象开始自救");
        //重新赋值
        ObjectHelpSelf.objectHelpSelf = this;
    }

    public static void main(String[] args) throws InterruptedException {
        objectHelpSelf = new ObjectHelpSelf();
        objectHelpSelf = null;
        System.gc();
        //finalize方法的优先级很低,所以睡眠一秒,方便看到效果
        TimeUnit.SECONDS.sleep(1);
        System.out.println("第一次gc后,objectHelpSelf=" + objectHelpSelf);
        objectHelpSelf = null;
        System.gc();
        //finalize方法的优先级很低,所以睡眠一秒,方便看到效果
        TimeUnit.SECONDS.sleep(1);
        System.out.println("第二次gc后,objectHelpSelf=" + objectHelpSelf);
    }
}

运行结果如下:

总结

可以发现使用了finalize()方法,在第一次的gc时,ObjectHelpSelf对象没有被回收,自救成功,而第二次gc时,ObjectHelpSelf对象为null,说明对象被回收了,这是因为任何一个对象的finalize()方法最多只会被系统自动调用一次,不然每次gc,对象都自救,那对象就永远会存在,造成类似内存溢出的效果了。同时该方法不建议使用,仅做了解即可。

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/107570222