• System.gc()与Object.finalize()的区别


    finalize()是由JVM自动调用的,你可以用System.gc(),但JVM不一定会立刻执行,JVM感觉内存空间有限时,才会开始执行finalize(),至于新的对象创建个数和被收集个数不同是因为收集的对象只和JVM的垃圾收集策略有关。

    finalize()和gc()
    (1)问题:finalize()函数是干嘛的?Java不是有Garbage Collection(以下简称gc)来负责回收内存吗?
    回答:
    gc 只能清除在堆上分配的内存(纯java语言的所有对象都在堆上使用new分配内存),而不能清除栈上分配的内存(当使用JNI技术时,可能会在栈上分配内 存,例如java调用c程序,而该c程序使用malloc分配内存时).因此,如果某些对象被分配了栈上的内存区域,那gc就管不着了,对这样的对象进行 内存回收就要靠finalize().
    举个例子来说,当java 调用非java方法时(可能是c),在非java代码内部也许调用了malloc()函数来分配内存,而且除非调用那个了 free() 否则不会释放内存(因为free()是c的函数),这个时候要进行释放内存的工作,gc是不起作用的,因而需要在finalize()内部的一个固有方法 调用它(free()).
    finalize的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存.所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作.

    通常,你不能指望finalize( ),你必须创建其它的“清除”方法,并且明确地调用它们。看来,finalize( )只能存在于程序员很难用到的一些晦涩用法里了。不过,finalize( )还有一个有趣的用法,它并不依赖于每次都要对finalize( )进行调用,这就是对象“终结条件”的验证。

    当你对某个对象不再感兴趣,也就是它可以被清除时,这个对象应该处于某种状态,使它占用的内存可以被安全地释放。例如,要是对象代表了一个打开的文 件,在对象被回收前程序员应该关闭这个文件。只要对象中存在没有被适当清除的部分,你的程序就存在很隐晦的错误。finalize( )的价值在于可以用来最终发现这种情况,尽管它并不总是会被调用。如果某次

    finalize( )的动作使得bug被发现,那你就可据此找出问题所在——这才是最重要的

     1 class Book {  
     2    boolean checkedOut = false;  
     3    Book(boolean checkOut) {  
     4     checkedOut = checkOut;  
     5    }  
     6   void checkIn() {  
     7    checkedOut = false;  
     8   }  
     9   public void finalize() {  
    10    if(checkedOut)  
    11     System.out.println("Error: checked out");  
    12    // Normally, you'll also do this:  
    13    // super.finalized();  
    14   }  
    15   }  
    16   public class TerminationCondition {  
    17    public static void main(String[] args) {  
    18     Book novel = new Book(true);  
    19     // Proper cleanup:  
    20     novel.checkIn();  
    21     // Drop the reference, forget to clean up:  
    22     new Book(true);  
    23     // Force garbage collection & finalization:  
    24     System.gc();  
    25    }  
    26   }  
  • 相关阅读:
    python 基础 7.1 datetime 获得时间
    Python 学习笔记12
    Python 学习笔记11
    Python 学习笔记10
    Python 学习笔记9
    Python 学习笔记8
    Python 学习笔记7
    Python 学习笔记6
    Python 学习笔记5
    Python 学习笔记4
  • 原文地址:https://www.cnblogs.com/wudidamowang666/p/11073279.html
Copyright © 2020-2023  润新知