zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    第十二章 满城搜索 [转载]
    第十三章 平安是福
    第三十章 就是他!
    CyberArticle和Live Writer的比较
    NET CMS 大全
    第十五章 禹皇门,震动!
    第六篇 匹马行天下 第二十三章 血流成河,悟!
    第二十八章 震天怒吼
    今天终于找了一个代理登陆了传说中的三个网站
    第十六章 夜深人静
  • 原文地址:https://www.cnblogs.com/wiessharling/p/3426507.html
Copyright © 2011-2022 走看看