Java中finalize()操作的顺序

时间:2017-06-06 11:52:31

标签: java oop garbage-collection finalize

我正在尝试理解有关Java垃圾收集器和finalize()方法的练习。

public class Five {
    static int x = 1;
    class String5 {
        String s;
        String5() {
            this.s = ""+(++x);
        }
        public void finalize() {
            System.out.print(s);
        }
    }

    String5 a = new String5();
    void f() {
        String5 a = new String5();
    }
    public void finalize() {
        System.out.print("H");
    }

    public static void main(String[] args) {
        Five a5 = new Five();
        a5.f();
        a5 = new Five();
        a5.f();
        System.gc();
        System.runFinalization();
    }
}

练习要求我预测输出。正确答案是532H。我预测输出应该是2H35,我不明白为什么我的订单不正确。

1 个答案:

答案 0 :(得分:4)

根据JLS,Java语言没有定义finalize方法的执行顺序,因此实际的顺序是实现细节。

JLS 12.6. Finalization of Class Instances

  

Java编程语言对finalize方法调用没有任何排序。终结器可以按任何顺序调用,甚至可以同时调用。

您遇到的顺序似乎建议堆栈实现 - 第4个和最后一个创建的String5实例有资格进行垃圾回收首先完成(打印5),然后是第2个和打印32的第1个(第3个不符合垃圾回收条件),最后完成第一个Five实例并打印H

但是,不同的JDK实现可能会产生不同的顺序。