`
luxhua
  • 浏览: 86299 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java垃圾回收器

阅读更多
http://blog.csdn.net/ForWayfarer/archive/2008/03/11/2171025.aspx 
   Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。
    由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。
    垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

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

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

<3>Java中垃圾回不回收,什么时候回收是JVM的事,是没办法控制的。用System.gc(),只能建议JVM进行垃圾回收,但垃圾回收工作也不一定执行。
    JVM只是保证你在需要内存的时候,给你内存,这是其他语言没法比拟的(个人认为是JAVA最成功的)


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

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

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

另外一个应用实例

class Book{
    public boolean checkedout = false;
    public Book(boolean checkout){
        checkedout = checkout;
    }
    public void checkIn(){
        checkedout = false;//状态转换 && 将checkedout变量归位到false
    }
    public void finalize(){
        if(checkedout)
            System.out.println("这本书没有执行checkIn");
    }
    public static void main(String[] args){
        Book ThinkingInJava = new Book(true);
        ThinkingInJava.checkIn();
        
        Book DataStructure = new Book(true);
        DataStructure = null;
        System.gc();
    }
}


分享到:
评论

相关推荐

    java垃圾回收机制

    详细描述讲解了java的垃圾回收机制

    JAVA垃圾回收机制

    垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变。垃圾收集的目的在于清除不再...

    Java垃圾回收机制

    Java垃圾回收机制的详细介绍,调理比较清晰,个人进行的总结。

    Java垃圾回收机制详解和调优.doc

    Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收...

    Java中类的生命周期与java垃圾回收机制

    Java中类的生命周期与java垃圾回收机制

    【Java面试题】Java垃圾回收机制

    【Java面试题】Java垃圾回收机制

    java 垃圾回收 机制详解

    说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物。经过半个世纪的发展,内存的动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,那为什么我们还要去...

    Java垃圾回收机制总结

    Java垃圾回收机制总结

    java垃圾回收机制简述

    此文档详细介绍了java回收机制的工作原理、工作过程,以及在程序中使用的一些注意事项

    java垃圾回收器代码举例

    java垃圾回收器机制,代码举例注释及个人笔记

    Java垃圾回收机制的学习和使用

    Java垃圾回收机制的学习和使用Java垃圾回收机制的学习和使用Java垃圾回收机制的学习和使用

    深入Java核心_探秘Java垃圾回收机制

    深入Java核心_探秘Java垃圾回收机制 深入Java核心_探秘Java垃圾回收机制

    Java垃圾回收机制和内存分配

    你认真演示了一遍,你就能明白JAVA的垃圾回收机制。当然文档写的不一定全面,比如文档当中关于老年区少年区有一页写的不是很完整,我也没有添加太多进去,但是还是很有很全面很有参考意义的。

    深入了解Java垃圾回收机制

    Azul Systems CTO & co-Founder, Gil Tene 在SpringOne2GX 2012大会上发表的演讲资料,全面深入地阐述Java垃圾回收的四种机制。并介绍了当今世界上性能与吞吐量最高的JVM产品Zing JVM。 如果希望深入了解Java的垃圾...

    Java垃圾回收机制详解

    Java垃圾回收机制详解!! GC详解!!

    java 垃圾回收机制详细介绍

    垃圾收集器是Java语言区别于其他程序设计语言的一大特色。它把程序员从手工回收内存空间的繁重工作中解脱了出来。在SUN公司的Java程序员(Java Programmer)认证考试中,垃圾收集器是必考的内容,一般最多可以占总...

Global site tag (gtag.js) - Google Analytics