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

恳求引用以下代码,我只想做一些关于不安全的事情。


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类的终结永远不会被调用。为什么?我找不到关键信息....


芜湖不芜
浏览 63回答 1
1回答

凤凰求蛊

此 OpenJDK 线程注意以下几点:不安全分配实例()是通过直接调用 JNI 的函数 [1] 在热点虚拟机中实现的。在 Java 堆中分配一个对象实例,但不会为此实例调用任何构造函数。AllocObject()此外,Java 语言规范 (§12.6.0) 特别指出:对象的构造函数的完成发生在 (§17.4.5) 之前 ,其 finalization 方法的执行(在形式意义上的发生之前)。鉴于在您的代码中您从未实际调用已分配实例的构造函数,因此如果不首先违反上述发生前顺序(§17.4.5),则无法调用该方法。Object.finalize()因此,永远不会调用该方法。Object.finalize()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java