【问题标题】:does JVM gives memory to local reference variable with value nullJVM 是否为值为 null 的局部引用变量提供内存
【发布时间】:2018-05-26 23:08:44
【问题描述】:

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

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

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

谁能解开我的疑惑。

【问题讨论】:

标签: java memory-management


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    • In Stack(temporary memory) - 对于局部变量内存分配在堆栈中,局部变量可能包括原始类型和引用类型。

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

      Animal 类型的动物变量(类名是用户定义的数据类型,使用关键字“class”声明)在堆栈中分配内存(局部变量),并且该变量可以保存 Animal(classname) 类型对象的引用表示堆栈中存在的 Animal(classname) 类型的动物变量包含堆中存在的 Object 的引用。

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

    【讨论】:

    • 哇!很好的解释。但是有了你的回答,我心里又多了一个疑惑。如果我在 show() 方法中声明了 Animal animal = new Animal(); 会怎样。现在,当 show 方法完成执行时,是否还有一个 new Animal() 对象仍在堆中,或者它会被擦除,或者它会成为 GC 稍后擦除的合格候选对象。
    • 动物 =new Animal();在 show() 方法中。对象存在于堆中,直到您的程序执行完毕。在程序执行期间,仅当对象未使用时,对象才会被 JVM 删除,这意味着对象引用必须初始化为 null,即动物=null,在这之后一个称为垃圾收集的JVM子程序识别出未使用的对象,现在垃圾收集器(gc它也是jvm的一个子程序)开始行动,它擦除由垃圾收集识别的未使用的对象。垃圾收集器以随机间隔开始发挥作用
    • ps- 只有在方法被调用时才创建 Animal 类型的对象,因为它在方法内部。
    • 另外说明,线程的堆栈内存通常是预先分配的,因此局部变量只会提高该堆栈内存中已使用的内存量,但无论是否使用,该内存都不可用无论如何到其他线程或堆。所以它不像是减少可用内存的分配。
    【解决方案3】:

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

    在声明引用时还有额外的空间,通过 JVM 将为每个对象发出的两个标头 - markclass 字词(直到我们有无标头对象)。 mark word 无法压缩,大小为 8 bytesclass word 默认是压缩的,它的权重是 4 bytes。从 java-8 开始有一个标志来控制它的压缩:

       -XX:-UseCompressedClassPointers
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      相关资源
      最近更新 更多