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()来验证终结条件,将很难被发现这种缺陷。

  • 相关阅读:
    Linux crontab定时执行任务 命令格式与详细例子
    git的color configura
    Linux不用使用软件把纯文本文档转换成PDF文件的方法
    linux sar命令详细说明相关参数
    linux下sar tool command note
    Linux see 网卡当前流量
    安装调试Installing Odoo
    寻找[nginx] 由Lua 粘合的Nginx生态环境-- agentzh
    git检查与放弃本地的代码修改情况
    发现linux shell中$0,$?,$!等的特殊用法
  • 原文地址:https://www.cnblogs.com/freeabyss/p/3414445.html
Copyright © 2011-2022 走看看