《Thinking in Java》读书笔记(四)——垃圾回收器

垃圾回收器——程序的对象终结条件是什么?如何定义?

(中文书P87起英文书P172起介绍垃圾回收器)

 

TerminationCondition.java后面所提到的终结条件具体是怎么定义的?看该代码我看不懂它是如何确定终结条件的,于是在网上查了很久,却没找到对终结条件的定义,却找到对垃圾回收器的详细介绍,个人感觉要比书上写得简单易懂,先做一下笔记。至于上面所提问题的答案还待继续研究。

 

Java垃圾回收器

 

Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。
   
由于有个垃圾回收机制,Java中的对象不再有作用域的概念,只有对象的引用才有作用域。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。

   
垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。


<1>
声明的是局部变量,应该是放在在栈中的,它所指向的对象被分配在堆中,垃圾回收器只回收堆中的对象。对于你的变量在其走出作用域时,自然就释放掉了。垃圾回收的时候,通常从栈中出发,到堆中寻找垃圾对象,然后收集。


<2>
java中尽管存在垃圾回收器,但是依然会出现内存泄露的问题,这是因为在程序中可能存在垃圾回收器无法收集的持续存在的无用引用。当不再使用一个对象时,最好明确置对象为null,但这并不能控制垃圾回收器立刻工作,只是做到通知垃圾回收器有需要回收的对象。如果系统中可用的内存过低,系统也会自动运行垃圾回收器释放对象占用的内存资源供其他对象使用。


<3>Java
中垃圾回不回收,什么时候回收是JVM的事,是没办法控制的。System.gc(),只能建议JVM进行垃圾回收,但垃圾回收工作也不一定执行

    JVM
只是保证你在需要内存的时候,给你内存,这是其他语言没法比拟的(个人认为是JAVA最成功的)



   
垃圾回收器只知道释放那些由new分配的内存。一旦垃圾回收器准备回收new对象,将首先调用finalize()方法,该方法能在垃圾回收时刻做一些清理工作。


   
这意味着在你不需要某个对象之前,如果必须执行某些动作,那么你得自己去做(finalize()方法)。通常不能指望finalize(),必须创建其他的"清理"方法,并且明确的调用它们。finalize()作用:对象"终结条件"的验证。

Java代码

  1. class finalizeTest...{   
  2.     public static void main(String[] args)...{   
  3.         Auto auto = new Auto();//当一个对象没有被引用时才会成为垃圾,这一句的new对象不是垃圾。   
  4.         auto = null; //刚才的new对象成为垃圾。   
  5.         new Auto();   
  6.        new Auto();   
  7.        System.gc();   
  8.     }   
  9. }   
  10.   
  11. class Auto...{   
  12.     public void finalize()...{   
  13.         System.out.println("Auto is going");   
  14.     }   
  15. }  

class finalizeTest...{

    public static void main(String[] args)...{

        Auto auto = new Auto();//当一个对象没有被引用时才会成为垃圾,这一句的new对象不是垃圾。

        auto = null; //刚才的new对象成为垃圾。

        new Auto();

       new Auto();

       System.gc();

    }

}

 

class Auto...{

    public void finalize()...{

        System.out.println("Auto is going");

    }

}



ps
finalize()方法放在Auto类中,则new Auto()对象回收的时候会被调用;如果finalize()方法放在finalizeTest类中,则new Auto()对象回收的时候不会被调用,new finalizeTest()对象回收的时候才会被调用。

运行结果:


Auto is going
Auto is going
Auto is going

另外一个应用实例

Java代码

  1. class Book{   
  2.     public boolean checkedout = false;   
  3.     public Book(boolean checkout){   
  4.         checkedout = checkout;   
  5.     }   
  6.     public void checkIn(){   
  7.         checkedout = false;//状态转换 && checkedout变量归位到false   
  8.     }   
  9.     public void finalize(){   
  10.         if(checkedout)   
  11.             System.out.println("这本书没有执行checkIn");   
  12.     }   
  13.     public static void main(String[] args){   
  14.         Book ThinkingInJava = new Book(true);   
  15.         ThinkingInJava.checkIn();   
  16.            
  17.         Book DataStructure = new Book(true);   
  18.         DataStructure = null;   
  19.         System.gc();   
  20.     }   
  21. }  

 

 

资料来源:http://luxhua.javaeye.com/blog/379790

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值