java - Java 中 Finalize() 操作的顺序

标签 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,但我不明白为什么我的排序不正确。

最佳答案

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

JLS 12.6. Finalization of Class Instances :

The Java programming language imposes no ordering on finalize method calls. Finalizers may be called in any order, or even concurrently.

您遇到的顺序似乎建议采用堆栈实现 - 第 4 个也是最后一个创建的符合垃圾回收条件的 String5 实例首先完成(打印 5) ,然后是第二个和第一个(第三个不符合垃圾回收条件),它们打印 32,最后是第一个 Five 实例最终确定并打印 H

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

关于java - Java 中 Finalize() 操作的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44389311/

相关文章:

java - 为什么没有抽象方法的情况下将类标记为抽象

java - java中的 vector 只包含对象?

c++ - 为什么要删除new分配的内存呢?

java垃圾收集-暂停应用程序线程?

c# - 为什么 Sun 不做 C# 到 Java 字节码编译器?

java - Gif 安全颜色选择器

java - 汉字Java的UTF编码

language-agnostic - 何时将方法设为静态?

C# 析构函数未按预期工作

java - 如何将以下比较器翻译为Comparator.comparing?