如何在java中的内存中表示null [duplicate]

问题描述 投票:6回答:4

可能重复: What exactly is null in Java memory

有没有人知道如何在对象或任何东西的内存中表示空值。在点网中,它由空指示符布尔值和相应类型的值(Refer here)表示。那么有谁知道它是如何在java中完成的?

java memory null
4个回答
9
投票

来自JVM specification, section 2.4

Java虚拟机规范没有强制要求编码null的具体值。

所以它可能是任何东西,但它很可能是一个全零的参考值。引用本身可以是简单的指针(即,只是与本机指针相同的虚拟地址,具有适当的体系结构大小),但同样不必如此。一些JVM具有处理引用的非常智能的方法 - 例如,Hotspot是able to use 32-bit values for references in many situations, even when running in an x64 process


2
投票

理论上它是一个JVM秘密,实际上它在32-bin VM上是0(0x00000000)。如果使用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

1
投票

不应为null本身分配内存,因为null实际上不是有效的对象实例。它只是一个占位符,表示对象引用当前不是指对象。

当你做类似的事情时:

String str = null;

分配的唯一东西是对字符串的引用(这类似于包含指针类型的语言中的字符串指针)。此引用是一个32位或64位变量(取决于您的硬件架构和Java版本),它位于堆栈中(可能取决于您的声明所在的确切上下文)。


1
投票

确切的表示没有指定,但我认为它只是0x0喜欢它在其他C类语言。这是一个特殊的值,不能以其他方式发生,不是额外的字段或额外的信息。

注意:当你有一个String时,它是一个引用而不是一个Object。这个4字节的值可以引用一个对象,或者在null的情况下,它是一个不是有效对象的值。

BTW:大多数64位JVM使用32位引用,除非堆是32 GB或更多。这在OpenJDK JVM中是可能的,因为所有对象都是8字节(或16字节)对齐。由于低3位或4位始终为0,因此无需存储,将地址范围扩展8倍或典型4 GB范围的16倍。

© www.soinside.com 2019 - 2024. All rights reserved.