Java清洁:终结处理和垃圾回收

一般情况:Java有垃圾回收机制负责回收无用对象占据的内存资源。

特殊情况:假定你的对象(并非使用new)获得一块特殊的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道如何释放该对象的这块“特殊”内存。

解决方法:

  Java允许在类中定义一个名为finalize()的方法。    

  finalize()工作原理:一旦垃圾回收器准备好释放对象占用的内存,将首先调用finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

总结:

  • 对象可能不被垃圾回收。
  • 垃圾回收并不等于“析构”。

finalize()的用途何在?

  垃圾回收只与内存有关。

  也就是说,使用垃圾回收器的唯一原因是为了回收程序不再使用的内存。所以对于与垃圾回收有关的任何行为来说(尤其是finalize()方法),它们也必须同内存及其回收有关。

  无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存。这就将对finalize()的需求限制到一种特殊的情况,即通过某种创建对象方式以外的方式为对象分配了内存空间。那么这种特殊情况到底是怎么回事?

  看来之所以要有finalize(),是由于在分配内存时可能采用了类似C语言中的做法,而非Java中的通常做法

例子:

public class Book {
    boolean checkedOut = false;
    Book(boolean checkout) {
        checkedOut = checkout;
    }
    
    void checkIn() {
        checkedOut = false;
    }
    
    protected void finalize() {
        if(checkedOut)
            System.out.println("Error: checked out");
    }

}
public class TerminationCondition {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Book novel = new Book(true);
        
        novel.checkIn();
        new Book(true);
        System.gc();
    }

}

output:

Error: checked out

原文地址:https://www.cnblogs.com/wiessharling/p/3426507.html