Java 中的 finalize() 操作顺序
Order of the finalize() operations in Java
我正在尝试了解有关 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.
您遇到的顺序似乎暗示了一个堆栈实现 - String5
的第 4 个也是最后一个创建的符合垃圾收集条件的实例首先完成(打印 5
),然后是第二个和第一个(第三个不符合垃圾收集条件)打印 3
和 2
,最后第一个 Five
实例完成并打印 H
。
但是,不同的 JDK 实现可能会产生不同的顺序。
我正在尝试了解有关 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.
您遇到的顺序似乎暗示了一个堆栈实现 - String5
的第 4 个也是最后一个创建的符合垃圾收集条件的实例首先完成(打印 5
),然后是第二个和第一个(第三个不符合垃圾收集条件)打印 3
和 2
,最后第一个 Five
实例完成并打印 H
。
但是,不同的 JDK 实现可能会产生不同的顺序。