• 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();
    }
    }
  • 相关阅读:
    动手篇:简易的首页登陆界面
    情感交流篇:HTML页面如何与后端联系
    MD5加密处理
    处女篇:自用C#后端SqlHelper.cs类
    动手篇:简单的注册界面与防SQL注入(续)
    十二省联考2019 字符串问题
    PKUWC2020游记
    uoj435 Simple Tree
    CF1303G Sum of Prefix Sums
    AGC069F Flags
  • 原文地址:https://www.cnblogs.com/liangzilingyu/p/12241121.html
Copyright © 2020-2023  润新知