为了账号安全,请及时绑定邮箱和手机立即绑定

通过分配实例(Java)从对象中完成从不调用

通过分配实例(Java)从对象中完成从不调用

芜湖不芜 2022-09-14 16:55:32
恳求引用以下代码,我只想做一些关于不安全的事情。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()


查看完整回答
反对 回复 2022-09-14
  • 1 回答
  • 0 关注
  • 50 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信