gpt4 book ai didi

使用 gc() 方法后不调用 Java finalize() 方法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:05:33 26 4
gpt4 key购买 nike

为了查看java中finalize()方法的工作原理,该方法在对象即将被销毁时被调用,我编写了以下程序

class counterTest{
public static int count;
public counterTest(){
count++;
}
}

public class finalize {

public static void main(String args[]){

counterTest obj1=new counterTest();
System.out.println("Number of objects :" + counterTest.count);
counterTest obj2=new counterTest();
System.out.println("Number of objects :" + counterTest.count);
Runtime rs=Runtime.getRuntime();
obj1=null;
obj2=null;
rs.gc();
}
protected void finalize(){
System.out.println("Program about to terminate");
counterTest.count--;
System.out.println("Number of objects :" + counterTest.count);
}
}

我希望输出是这样的

Number of objects :1 
Number of objects :2
Program about to terminate
Number of objects :1
Program about to terminate
Number of objects :0

但我只得到前两行。由于我将对象引用为 null,然后调用 gc() 方法,因此我希望应该显示在 finalize() 方法中编写的语句。这是否意味着不能保证每次我们使用 gc() 方法时都会调用 finalize() 方法。

最佳答案

您的 finalize 方法应该在 counterTest 中,然后它“可能”会被调用。您永远不会真正创建“完成”类的实例。因此您的 finalize 方法永远不会有机会被执行。

这里是更新后的代码,应该可以按预期工作:

class counterTest{
public static int count;
public counterTest(){
count++;
}

protected void finalize(){
System.out.println("Program about to terminate");
counterTest.count--;
System.out.println("Number of objects :" + counterTest.count);
}
}

public class Finalize {

public static void main(String args[]){

counterTest obj1=new counterTest();
System.out.println("Number of objects :" + counterTest.count);
counterTest obj2=new counterTest();
System.out.println("Number of objects :" + counterTest.count);
Runtime rs=Runtime.getRuntime();
obj1=null;
obj2=null;
rs.gc();
}

}

应该注意的是,“finalize”方法并不意味着被覆盖,因为它们是不可靠的。你永远不知道垃圾收集器什么时候会收集一个特定的对象,所以依赖它来关闭你的数据库连接或做其他类似的事情是不,不,不...

关于使用 gc() 方法后不调用 Java finalize() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38420378/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com