代码之家  ›  专栏  ›  技术社区  ›  JPG

JVM是否为值为null的本地引用变量提供内存

  •  1
  • JPG  · 技术社区  · 8 年前

    我对java中的内存管理感到困惑。所有地方都写着局部变量在堆栈中被赋予内存。如果该局部变量是对象类型,则在堆中为其提供内存。我想知道JVM在哪里为值为null的本地对象引用变量分配内存。

    public void show(){
    Animal animal = null;
    }
    

    JVM在哪里为动物对象分配内存。它在堆叠中吗?或者它不提供任何内存,因为它被标记为null。我确信堆中没有给它分配内存。

    有人能消除我的疑虑吗。

    3 回复  |  直到 8 年前
        1
  •  5
  •   kakurala    8 年前

    我认为引用动物将存储在堆栈中,直到方法完成其执行,但对象的状态将存储在堆中。

    因此,在上述情况下,指向null的对象将在堆栈本身中分配null,否则,如果初始化该对象,它将在堆中拥有该对象的地址。

        2
  •  3
  •   Sai Kiran    8 年前
    • 在堆栈中(临时内存)—对于在堆栈中分配内存的局部变量,局部变量可能包括基元和引用类型。

      例如,Animal Animal=空; 在方法“public void show()”中声明并分配了一个值,该方法在调用该方法时获取堆栈中分配的内存。执行该方法后,本地变量animal将从堆栈中删除,因此堆栈是临时内存。

      animal类型的动物变量(类名是使用关键字“class”声明的用户定义的数据类型)获取堆栈中分配的内存(局部变量),该变量可以保存animal类型的对象(classname)的引用,这意味着堆栈中存在的animal类型的ur animal变量(classname)保存堆中存在的对象的引用。

    • 在堆中——对于对象,内存在堆中分配,例如变量(非静态变量)内存在对象中分配,对于静态变量,内存在静态常量池中分配

        3
  •  2
  •   Eugene    8 年前

    只是一个小小的补充。该引用将在堆栈上分配,并将加权 4 bytes 一般情况下(除非 CompressedOops 都是假的 默认情况下。控制它的标志是 -XX:+UseCompressedOops ). 如果禁用该属性,则引用将 8 bytes 长的

    当您通过JVM将为每个对象发出的两个标头声明引用时,还有额外的空间- mark class 文字(直到我们有无头的物体)。 mark word 无法压缩,并且 8字节 在尺寸上; class word 默认情况下是压缩的,并且它具有权重 4字节 . 自java-8以来,有一个标志来控制其压缩:

       -XX:-UseCompressedClassPointers
    

    将没有额外的空间用于 Object 本身(存储在堆上,因为它为null);否则,如果您将其声明为 new Animal() -这将是它的属性大小 Animal 填充到 8 bytes alignment .