首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

java中关于finalize()方法,该如何解决

2012-03-09 
java中关于finalize()方法请教:finalize这个方法是不是当对像为null时,垃圾收集器在回收此对象之前所调用

java中关于finalize()方法
请教:
finalize这个方法是不是当对像为null时,垃圾收集器在回收此对象之前所调用的方法呢?
我写了一个Person类,重写了finalize()方法。

Java code
public class Person{        private String name;    private int age;        public Person(String name, int age){        this.name = name;        this.age = age;    }        public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }        protected void finalize() throws Throwable {        System.out.println("已回收!");    }    public String toString() {        return "大家好!我的名字叫" + name + ",今年" + age + "岁了!";    }    }


以下是测试类:
Java code
public class Test1 extends Thread{    public void run() {        System.out.println(new Person("张三",23));    }    public static void main(String[] args) throws InterruptedException {        System.out.println("程序运行开始");        new Test1().start();        Thread.sleep(100000);        System.out.println("程序运行结束!");    }}



执行结果如下:
程序运行开始
大家好!我的名字叫张三,今年23岁了!
程序运行结束!


为什么finalize()没有执行呢?是我理解错了,还是写的例子不明够说明?

[解决办法]
在我这上面可以执行的呀!要不你用System.gc()来强制执行。
[解决办法]
finalize是gc线程执行的时候会调用的对象方法
[解决办法]
垃圾回收器是JVM自动完成的。
他是JVM对无用的对象做垃圾回收,但并不是只要是没有被引用的对象就会被回收,垃圾回收器的运行是不确定的,有的时候内存足够,垃圾回收器根本不会运行。就像生活垃圾扔在垃圾箱里,但是垃圾车什么时候来回收垃圾箱中的垃圾是客户不能确定的。

对象在被回收之前会调用对象的finalize()方法
垃圾回收线程是低优先级线程,System.gc(),Runtime.gc(),只是告诉JVM赶紧做垃圾回收,但JVM并不是立刻就来回收,回收时刻还是不确定的,就像垃圾箱满了,你打电话叫垃圾站来回收,但并不是垃圾站马上就会来,只是几率增大了。

面向对象编程--孙卫琴 这本书讲的比较清楚。
[解决办法]
垃圾回收器是系统自动完成的,在回收之前会调用对象的finalize()方法,只是程序员建议系统进行垃圾回收,并不是强制性的要求。
[解决办法]
探讨
垃圾回收器是JVM自动完成的。
他是JVM对无用的对象做垃圾回收,但并不是只要是没有被引用的对象就会被回收,垃圾回收器的运行是不确定的,有的时候内存足够,垃圾回收器根本不会运行。就像生活垃圾扔在垃圾箱里,但是垃圾车什么时候来回收垃圾箱中的垃圾是客户不能确定的。

对象在被回收之前会调用对象的finalize()方法
垃圾回收线程是低优先级线程,System.gc(),Runtime.gc(),只是告诉JVM赶紧做垃圾回收…

[解决办法]
垃圾回收器是JVM自动完成的 
对象在被回收之前会调用对象的finalize()方法 
垃圾回收线程是低优先级线程,System.gc(),Runtime.gc(),只是告诉JVM赶紧做垃圾回收,但JVM并不是立刻就来回收,回收时刻还是不确定的,就像垃圾箱满了,你打电话叫垃圾站来回收,但并不是垃圾站马上就会来,只是几率增大了。 
顶3楼的学习

[解决办法]
有时当撤消一个对象时,需要完成一些操作。例如,如果一个对象正在处理的是非Java 资源,如文件句柄或window 字符字体,这时你要确认在一个对象被撤消以前要保证这些资源被释放。为处理这样的状况,Java 提供了被称为收尾(finalization )的机制。使用该机制你可以定义一些特殊的操作,这些操作在一个对象将要被垃圾回收程序释放时执行。

要给一个类增加收尾(finalizer ),你只要定义finalize ( ) 方法即可。Java 回收该类的一个对象时,就会调用这个方法。在finalize ( )方法中,你要指定在一个对象被撤消前必须执行的操作。垃圾回收周期性地运行,检查对象不再被运行状态引用或间接地通过其他对象引用。就在对象被释放之前,Java 运行系统调用该对象的finalize( ) 方法。

finalize()方法的通用格式如下:

protected void finalize( )
{
// finalization code here
}

其中,关键字protected是防止在该类之外定义的代码访问finalize()标识符。该标识符和其他标识符将在第7章中解释。

理解finalize( ) 正好在垃圾回收以前被调用非常重要。例如当一个对象超出了它的作用域时,finalize( ) 并不被调用。这意味着你不可能知道何时——甚至是否——finalize( ) 被调用。因此,你的程序应该提供其他的方法来释放由对象使用的系统资源,而不能依靠finalize( ) 来完成程序的正常操作。


[解决办法]
3楼 说的不错,
我感觉一般情况就不用finalize 呀
[解决办法]
finalize
system.gc
只能提示JVM进行垃圾回收

热点排行