zoukankan      html  css  js  c++  java
  • java回收finalize方法的作用(编程思想)

    清理:终结处理和垃圾回收
    java有垃圾回收期负责回收无用对象占据的内存资源。但也有这种情况:假定你的对象(并非使用new)获得了一块“特殊”的内存区域,由于垃圾回收期只知道释放那些由new分配的内存,所有它不知道该如何释放对象这块“特殊内存”。为了应对这种情况,Java允许在类中定义一个名为finalize()的方法。它的工作原理“假定”是这样的:
    一旦垃圾回收期准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。所以要是你打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作。
    例子模拟:
    假设某个对象在创建过程中会自己绘制到屏幕上,如果不是明确的从屏幕上将其擦除,它可能永远得不到清理。如果在finalize()里加入某种擦除功能,当“垃圾回收”发生时(不能保证一定会发生),finalize()方法得到了调用,图像就会被擦除,下一次垃圾回收就会回收掉。
    也许你会发现,只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总得不到释放。如果程序执行结束,并且垃圾回收器一直没有释放你创建的任何对象的存储空间,则随着程序的退出,那些资源也会全部交还给操作系统。这个策略是恰当的,因为垃圾回收本身也有开销,要是不使用它,也就不用支付这部分开销了。

    finalize使用例子:验证终结条件
    public class TestFinalize {
    public static void main(String[] args){
    Book novel = new Book(true);
    novel.checkIn();
    //Drop the reference. forget to clean up
    new Book(true);
    //Force garbage collection & finalization
    System.gc();
    }
    }
    class Book{
    boolean checkOut = false;
    Book(boolean checkOut){
    this.checkOut = checkOut;
    }
    void checkIn(){
    checkOut = false;
    }
    protected void finalize(){
    if(checkOut){
    System.out.println("Error: checked out");
    }
    }
    }

  • 相关阅读:
    高德地图修改背景色
    shell程序的编写
    WPF程序,运行时,结束时,要运行的操作(自动保存,检查单程序)
    android EditText光标位置(定位到最后)
    字体结构的Baseline/Leading/Ascent/Descent的图示
    Java解析xml(转)
    python常用抽象基类1
    airflow之SubDAGs(转载)
    java解析xml(转)
    python内部类
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/7221528.html
Copyright © 2011-2022 走看看