如何在Java内存为空表示。[复制](How is null represented in memo

2019-08-06 07:21发布

可能重复:
究竟什么是Java内存空

有谁知道一个空值是如何在对象或任何存储表示。 在点网它是由空指示符布尔值和相应的类型的值(表示参考这里 )。 所以没有任何一个知道它是如何在Java做?

Answer 1:

从JVM规范,第2.4节 :

Java虚拟机规范并没有规定具体的值编码为空。

因此,它可以是任何东西,但它很可能是一个参考值是全零。 参考文献本身可以是简单的指针(即只是一个虚拟地址以同样的方式作为本机的指针,该结构的适当大小的),但是又没有要。 某些JVM具有处理引用的非常聪明的方式-例如,热点是能够在64位进程中运行时使用32位值在许多情况下引用,甚至 。



Answer 2:

从理论上讲它是一个JVM的秘密,在实践中是0(00000000)32斌VM。 如果你使用Oracle JVM可以使用sun.misc.Unsafe,它可以在任何地址读取内存的内容,来验证。

public class Test {
    int i1 = 100;
    String s = null;
    int i2 = 200;

    public static void main(String[] args) throws Exception {
        Test test = new Test();
        System.out.println(getInt(test, "i1"));
        System.out.println(getInt(test, "s"));
        System.out.println(getInt(test, "i2"));
    }

    static int getInt(Test test, String name) throws Exception {
        Unsafe u = getUnsafe();
        long offset = u.objectFieldOffset(Test.class.getDeclaredField(name));
        return u.getInt(test, offset);
    }

    static Unsafe getUnsafe() throws Exception {
        Field f = Unsafe.class.getDeclaredField("theUnsafe");
        f.setAccessible(true);
        return (Unsafe) f.get(null);
    }
}

产量

100
0
200


Answer 3:

没有记忆应该分配给空本身,因为空实际上不是一个有效的对象实例。 这只不过是一个占位符,指示该对象引用当前未参照的对象。

当你做这样的事情:

字符串str = NULL;

分配的唯一一件事就是一个字符串的引用(这类似于在包含指针类型语言的字符串指针)。 此引用驻留在堆栈上的32或64位变量(取决于你的硬件结构和Java版本)(可能是,取决于其中的声明被使用的确切上下文)。



Answer 4:

没有指定确切的表示形式,但我会假设它仅仅是0x0就像它在其他C语言的语言。 它是无法以其他方式发生,而不是附加的场或者多余碎片的信息的特殊值。

注意:当你有一个String它是一个参考不是对象。 这个4字节的值可以指一个对象或在的情况下, null是一个值,它是不是有效的对象。

顺便说一句:大多数64位JVM使用32位引用,除非堆是32 GB或更大。 如所有的对象都8字节(或16字节)对准。这是在OpenJDK的JVM可能的。 作为下部3或4位始终为0他们并不需要被存储在由8倍或16倍的典型4 GB范围扩大的地址范围。



文章来源: How is null represented in memory in java [duplicate]
标签: java memory null