恳求引用以下代码,我只想做一些关于不安全的事情。import sun.misc.Unsafe;import java.lang.reflect.Field;import java.util.*;public class A { public static void main(String[] args) throws Exception { Field f = Unsafe.class.getDeclaredField("theUnsafe"); f.setAccessible(true); Unsafe u = (Unsafe) f.get(null); System.out.println("the while start at:" + new Date()); long total = 0; while (true) { u.allocateInstance(B.class); total++; if (total % 100000000 == 0) { System.out.println(total); System.gc(); } } }}class B { private int a; private int b; private double d; private float e; @Override protected void finalize() { try { super.finalize(); } catch (Throwable e) { System.out.println("catch excep"); } System.out.println("class B finalize, the a:" + a); }}代码永远不会被调用,但B类的终结永远不会被调用。为什么?我找不到关键信息....
1 回答
凤凰求蛊
TA贡献1825条经验 获得超4个赞
此 OpenJDK 线程注意以下几点:
不安全分配实例()是通过直接调用 JNI 的函数 [1] 在热点虚拟机中实现的。在 Java 堆中分配一个对象实例,但不会为此实例调用任何构造函数。
AllocObject()
此外,Java 语言规范 (§12.6.0) 特别指出:
对象的构造函数的完成发生在 (§17.4.5) 之前 ,其 finalization 方法的执行(在形式意义上的发生之前)。
鉴于在您的代码中您从未实际调用已分配实例的构造函数,因此如果不首先违反上述发生前顺序(§17.4.5),则无法调用该方法。Object.finalize()
因此,永远不会调用该方法。Object.finalize()
添加回答
举报
0/150
提交
取消