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

时间:2017-12-13 06:09:43

标签: java memory-management

我对java中的内存管理感到困惑。在任何地方都写入了局部变量在堆栈中给出的内存。如果该局部变量是对象类型,则在堆中给出内存。我想知道JVM在哪里为值为null的本地对象引用变量分配内存。

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

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

任何人都可以清除我的怀疑。

3 个答案:

答案 0 :(得分:5)

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

因此,在上面的情况下,对象指向null然后它将在堆栈本身中分配null,否则如果初始化对象,那么它将具有堆中对象的地址。

答案 1 :(得分:3)

  • 在堆栈中(临时内存) - 对于局部变量,内存在堆栈中分配,局部变量可以包括基本类型和引用类型。

    例如Animal animal = null; 您已声明并在方法内分配了一个值" public void show()"调用方法时,获取在堆栈中分配的内存。在执行该方法之后,从堆栈中擦除局部变量动物,因此堆栈是临时存储器。

    Animal类型的动物变量(类名是用户定义的数据类型,使用关键字&#34声明;类")获取在堆栈中分配的内存(局部变量),变量可以保存类型对象的引用Animal(classname)表示堆栈中存在的类型Animal(classname)的ur动物变量保存堆中存在的Object的引用。

  • 在heap-for对象中,内存是在堆中分配的,例如变量(非静态变量)内存是在对象内分配的,对于静态变量内存是在静态常量池中分配的

答案 2 :(得分:2)

只是一小部分。该引用将在堆栈上分配,它通常会加权4 bytes(除非CompressedOops关闭,默认情况下它们。控制它的标志是{{1 }})。如果禁用该属性,则引用的长度为-XX:+UseCompressedOops

当您通过JVM将为每个对象发出的两个标头声明引用时还有额外的空间 - 8 bytesmark字(直到我们有无标题对象)。 class无法压缩,且mark word的大小不一致;默认情况下会对8 bytes进行压缩,并对其进行加权class word。自java-8以来,有一个标志可以控制它的压缩:

4 bytes

-XX:-UseCompressedClassPointers 本身没有额外的空间(存储在堆上 - 因为它是空的);否则,如果您将其声明为Object - 那将是new Animal()填充到Animal的属性的大小。