java - 组合中最终确定的输出不确定

标签 java garbage-collection composition garbage finalize

为什么下面程序的输出会在 Course 的 Finalize() 之前运行 Classmate 的 Finalize ? Classmate 使用类 Course 对象,因此其 Finalize() 应该在 Course 的 Finalize() 之后运行?但输出显示相反。为什么?

class Classmate{

    Course mca;
    Classmate(){
        System.out.println("Student const. `enter code here`called");
        mca = new Course();
        mca.getCourse();
    }

    @Override
    protected void finalize()  {System.out.println("good bye Student"); 

    }
}
class Course{
    Course(){
        System.out.println("Course const. called"); 
    }

    void getCourse(){
        System.out.println("your ccourse is MCA");
    }

    @Override
    protected void finalize() throws Throwable {
        // TODO Auto-generated method stub
    System.out.println("goodbye course");
    }
}



public class Composition {

public static void main(String[] args) {

    Classmate ram = new Classmate();
    ram=null;
    System.gc();
    for(int i=0;i<5;i++)
        System.out.println("i is "+i);
}
}

输出:

Student const. called

Course const. called

your ccourse is MCA

good bye Student

i is 0

goodbye course

i is 1

i is 2

i is 3

i is 4

最佳答案

这样做是为了给您(以及任何其他 Java 程序员)上一课。这个教训是:不要假设何时(或者更好的if)调用finalize。

说真的:你可以看看这个很棒的 question并且会发现对 Finalize 的调用与垃圾收集器的操作绑定(bind)在一起。事实是:当垃圾收集器决定收集东西时,您绝对没有控制权或“洞察力”。大多数时候,如果您不对正在处理的“设置”进行更改,它的 Activity 将导致相同的结果。例如:使用完全相同的 JVM 设置运行完全相同的示例。但一旦您开始关注“现实世界”的应用程序……您就会一直遇到意想不到的惊喜。

哎呀 - 甚至不能保证最终调用曾经。因此,您的代码不应依赖它。因此,使用 Finalize 的充分理由几乎为零。

换句话说:如果你真的想了解正在发生的事情;您必须深入研究 JVM 正在使用的 GC 的实现;了解 GC 定义垃圾的原因和时间;以及当它开始收集垃圾时。

关于java - 组合中最终确定的输出不确定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38076389/

相关文章:

c# - 垃圾收集前是否清除了内存?

go - Go 与 C++ 中的抽象基类设计

python - 为什么要在python中使用工厂方法?

java - 如果我的类(class)已经在扩展另一个类(class),如何使用 unicastremoteobject ...?

java - getWindow().getAttributes() 期间出现 NullpointerException;

javascript - Chrome 垃圾收集

方法返回的java堆栈和对象

java - 组合、转发和包装

Java泛型和继承: am I trying to be too clever?

java - 是否有可能检测到哪些已弃用的类被积极使用?