您的位置:首页 > 编程语言 > Java开发

深入java-----垃圾回收机制

2014-11-27 16:13 337 查看
关于J***A垃圾回收机制的一些总结

1 关于finalize()方法

这是一个类内部的方法,在基类中就有定义,如果需要使用可以重写该方法,protected void finalize(),一旦垃圾回收期准备好对象占用的存储空间,将首先调用finalize()方法,并且在垃回收动作发生之前调用该方法,之后才会释放占用的内存,所以可以使用finalize()方法做一些重要的清理工作,或者是一些标记工作(对象终结条件的验证)。绝对不能直接调用finalize(),该方法是在后台系统级线程自动调用的。如果父类也有finalize()方法,可以super.finalize()。

2 关于System.gc()方法

这是向JVM提出垃圾申请的一个方法,只是告诉JVM这里有一个垃圾需要处理,但不一定会被处理。我们可以显示调用,但是不建议这么使用,会增加系统开销。在创建对象时。如果对象没有引用,就会成为垃圾,比如直接new BooK(),但此时并没有定义一个引用指向该对象,成为一个垃圾,又或者在赋值给一个引用之后,把该引用=Null,则该对象的引用计数=0,在申请gc进行处理时可能会被清理。要养成在不用一个引用之后把它设为空null的习惯。方便进行垃圾回收。

3 下面使用thinking in java P89中例子程序详细说明finalize()的一个作用以及System.gc()方法的使用

package com.itany.www;
public class Book
{
    private boolean checkOut;
    Book(boolean checkOut)
    {
        this.checkOut=checkOut;
    }
    //checkIn之后checkOut就会变成假
    public void checkIn()
    {
        checkOut=false;
    }

    protected void finalize()
    {
        /*
         * 如果没有checkIn也就是checkOut为真 在系统清理垃圾之前自动调用finalize时会验证  
         * 也就是你可以把在对象垃圾清理之前  做一些你想做的事情 比如验证终结条件 是否已经被签入checkIn
         * 只有成功签入的书的对象才会正常被清理
         */
        if(checkOut)
        {
           System.out.println("ERROR  BOOKSTATE:CHECKOUT");
        }
        else
        {
            System.out.println("OK  BOOKSTATE:CHECKIN");
        }
        //父类的finalize如果也要做一些事情的话就要调用super.finalize()方法 如果不需要的话就不要调用了
//        try
//        {
//            super.finalize();
//        }
//        catch (Throwable e)
//        {
//            e.printStackTrace();
//        }
    }
}

<pre name="code" class="java">public class Test
{
    public static void main(String[] args)
    {
        //对象创建以后没被任何变量引用,所以被视为垃圾对象
//        new Book(true);
        Book cc=new Book(true);
        cc=null;
        System.gc();
    }
}
运行结果:ERROR  BOOKSTATE:CHECKOUT
如果只运行
<pre name="code" class="java">new Book(true);

System.gc();



也(可能)会出现同样的结果推荐补充博客:http://blog.csdn.net/zsuguangh/article/details/6429592





                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: