内存中的“null”在哪里

时间:2011-11-14 20:59:40

标签: java memory jvm initialization

在java中,你不能在声明中声明数组的大小

int[5] scores;  //bad

我被告知这是因为在初始化对象之前,JVM不会在内存中分配空间。 如果你有一个实例数组变量(使用默认值null自动初始化),该变量是否指向堆中指示为null的位置?

5 个答案:

答案 0 :(得分:3)

空引用实际上是零值。操作系统会阻止任何程序访问内存中的零地址,因此JVM会在允许您访问之前主动检查并确保参考值不为零。这让JVM为您提供了一个很好的NullPointerException而不是“程序执行了非法操作”崩溃。

所以你可以说变量“指向”无效的堆位置。或者你可以说变量没有“指向”任何东西。那时它只是一个语义问题。

答案 1 :(得分:3)

不,因为在JVM中没有必要这样做。 如果您使用的是母语(例如C和C ++),则NULL是一个零值的指针,它指向内存基址。显然这不是一个有效的地址,但你“可以”取消引用它 - 特别是在没有受保护的内存的系统中,如旧的MS-DOS或嵌入式处理器的小型。并不是说它是一个有效的地址 - 通常该位置包含中断向量,你不应该触摸它们。当然,在任何会引发保护错误的现代操作系统中。

但是在JVM中,对象的引用更像是句柄(即表中的索引),而null是'不可能'的值(在表的域之外的索引),所以它可以'被解除引用并且不占用这种表格中的空间。

答案 2 :(得分:2)

我认为这篇文章将回答您的问题 - Java - Does null variable require space in memory

  

在Java中,null只是一个引用的值(基本上是一个   限制指针)可以有。这意味着参考指的是   没有。在这种情况下,您仍然占用参考空间。   这是32位系统上的4个字节或64位系统上的8个字节。   但是,你没有为该课程消耗任何空间   引用指向直到您实际分配该实例   class将引用指向。

     

编辑:就字符串而言,Java中的字符串需要16位(2字节)   对于每个角色,加上少量的簿记费用,   这可能是未记录的,具体实现的。

(如果它可以帮助你,请记住在链接中提出答案)

答案 3 :(得分:1)

没有......你将在对象的变量中有一个null(0x00)引用。

答案 4 :(得分:0)

我认为“int [5]得分; //差”不是由于内存分配造成的。 请注意,当您声明某些内容时,您确实在声明 类型ReferenceName = new Type() 通常

观察这两个例子     int [] scores = new int [5];     JLabel label = new JLabel();

类型(在左侧)是int []和JLabel,它们与内存分配无关(指针除外),而新实例(在右侧,需要内存分配)是int [5],需要5个整数的空间和JLabel(),不需要参数来调用构造函数,但是内存足够用于JLabel。