zoukankan      html  css  js  c++  java
  • 【Java之对象清理】finalize()的用途

    Java允许在类中定义一个名为finalize()的方法。它的工作原理是:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法。并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

    关于垃圾回收,有三点需要记住:

      1、对象可能不被垃圾回收。只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总也得不到释放。

      2、垃圾回收并不等于“析构”。

      3、垃圾回收只与内存有关。使用垃圾回收的唯一原因是为了回收程序不再使用的内存。

    finalize()的用途:

      无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存。这就将对finalize()的需求限制到一种特殊情况,即通过某种创建对象方式以外的方式为对象分配了存储空间。不过这种情况一般发生在使用“本地方法”的情况下,本地方法是一种在Java中调用非Java代码的方式。

      finalize()方法还有一个有趣的用法,就是对象终结条件的验证。简单的说就是通过调用finalize()来发现一些隐晦的缺陷。例如:

      

    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){
    		Book novel = new Book(true);
    		novel.checkIn();
    		new Book(true);
    		System.gc();
    	}
    }
    

      本例的终结条件是:所有的Book对象在被当作垃圾回收前都应该被签入。但在main方法中,由于程序错误,有一本书未被签入。要是没有finalize()来验证终结条件,将很难被发现这种缺陷。

  • 相关阅读:
    [bzoj3524]Couriers
    [bzoj2789]Letters
    [bzoj4318]OSU!
    [luogu4570]元素
    [hdu6600]Just Skip The Problem
    [bzoj5025]单调上升路径
    [bzoj4557]侦察守卫
    [hdu5379]Mahjong tree
    [bzoj2957]楼房重建
    [noi253]A
  • 原文地址:https://www.cnblogs.com/freeabyss/p/3414445.html
Copyright © 2011-2022 走看看