• JAVA基础篇 之 finalize()方法的作用


    我们知道java有垃圾回收器负责回收无用对象占据的内存资源,但也有特殊情况:假设你的对象(并非使用new)获得了一块特殊的内存区域,由于垃圾回收器只知道回收那些经由new分配的内存,所以它不知道如何释放该对象的这块特殊的内存。为了应对这种特殊情况,java允许在类中定义一个名为finalize()的方法。它的工作原理假定是这样的:一旦垃圾收集器准备释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存,所以如果你打算用finalize(),就能在垃圾回收时刻做一些重要的清理动作。-----------《think in java》

    ​ 我先说下我理解的重要的几点:

    1. finalize()方法会在对象被回收前调用

    2. 不建议使用finalize()方法

    3. finalize()的唯一的,不常用的作用就是在对象被回收前做一些检测,去发现一些程序的缺陷:

      代码如下:

      public class Test {
          public static void main(String[] args) {
              Book b = new Book(true);
              b.checkIn();
              new Book(true);
              System.gc();
          }
      
          static class Book {
              boolean checkout = false;
      
              Book(boolean checkout) {
                  this.checkout = checkout;
              }
      
              void checkIn() {
                  checkout = false;
              }
      
              @Override
              protected void finalize() throws Throwable {
                  if (checkout) {
                      System.out.println("该对象状态异常,应该先checkIn才能被收回");
                  }
              }
          }
      
      }
      
      

      ​ 在上面的例子中,所有的Book对象在被当作垃圾回收前都应该被checkIn,但在main()方法中,由于我们的疏忽,导致有一本书未被checkIn。要是我们没在finalize()方法中验证的话,很难发现这种错误。

  • 相关阅读:
    C# 串口调试助手源码
    C# 中 textBox 侧面滑条 属性
    C# 中 comboBox 禁止输入
    VS2015 下载 破解
    中国移动OnetNet云平台 GET指令使用
    JSON JsonArray和JsonObject学习资料
    sublime 添加 ConvertToUTF-8
    sublime 添加 颜色插件 colorcoder
    线程池
    爬虫中基本的多线程
  • 原文地址:https://www.cnblogs.com/daimzh/p/12854460.html
Copyright © 2020-2023  润新知