【问题标题】:JVM allocates memory at declaration for primitive types, but not for non-primitive types?JVM在声明时为原始类型分配内存,而不是为非原始类型分配内存?
【发布时间】:2015-12-24 22:27:00
【问题描述】:

我来自 C/C++ 背景,对 java 很陌生,我很难理解 java 中的变量声明和内存分配。

当我们写作时,

myclass myobject;

我们声明 myobject 是 myclass 类型的变量。我们没有为它分配内存。

int a;

它声明了变量 a 并分配了等于 int 大小的内存。

是这样吗?编译器是否为原始数据类型分配内存而不为非原始数据类型分配内存?

我也提出了类似的疑问here

【问题讨论】:

    标签: java


    【解决方案1】:

    编译器不分配内存。分配内存的JVM

    对于原始数据类型,在声明这些变量时分配内存,并且在该函数本地堆栈中获取内存。
    int x;

    在堆栈 4 字节中分配的内存

    当我们使用 new 操作符时,内存被分配给堆,这是类的数据成员的大小。
    MyClass object;

    这是一个引用变量,大小也为 4 字节

    object = new MyClass();

    new 运算符在堆中分配内存,大小是所有个体的总和 该类的数据成员的大小。

    【讨论】:

    • 原始数据类型可以是成员,因此可以存在于堆上。未指定参考的大小。不要对未引用的文本使用引号格式。
    【解决方案2】:

    是这样吗?编译器是否为原始数据类型分配内存而不为非原始数据类型分配内存?

    首先要注意的是编译器不会分配任何内存。 JVM 这样做。

    谈到实际问题,是的。对于原始天气,您是否稍后对其进行初始化,一旦您声明,内存就会分配。

    这是原语的数据量

    https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

    对于对象,在初始化时分配内存。内存的大小实际上取决于类数据。

    【讨论】:

    • 你确定未初始化的变量在声明时会分配内存吗?至于字节码,没有什么说“此时声明了变量”-该变量仅在第一条*STORE指令中弹出,该指令将堆栈上的顶部值存储到局部变量槽中。 Java 字节码中的每个方法都有一个MAXLOCALS 属性,这是为了告诉JVM 为堆栈帧分配多少内存。
    • @Clashsoft 据我所知,对于在堆上分配内存和局部变量弹出到堆栈的字段。
    • @Clashsoft 当然可以。您认为默认值存储在哪里?
    【解决方案3】:

    在java中,变量的声明并不意味着分配内存空间,而是意味着这个变量以后可以持有与其类(或子类)相同类型的对象的引用。

    MyClass myObject; // myObject 有空值(仅声明)

    写入时正在分配内存空间:

    MyClass myObject = new MyClass(); // 当我们使用 new 操作符时(分配发生)

    现在 myObject 具有指向 new MyClass() 生成的对象的引用,并且该对象的大小取决于其类声明中的数据字段。

    结论

    声明

    int a; // 分配固定大小,因为 int 大小是已知的,无法更改

    MyClass myObject; // 有空值

    myObject = new MyClass(); // 现在有了这个对象的引用

    希望对您有所帮助:)。

    【讨论】:

    • 所有变量都占用内存。引用变量为引用占用了足够的内存,它们可以指向的对象占用更多的内存。
    • "MyClass myObject; // 具有空值" 这仅适用于字段!局部变量没有默认值。
    【解决方案4】:

    在 Java 中, 当我们声明一个类类型的变量时,只会创建一个引用(不为对象分配内存)。要为对象分配内存,我们必须使用 new() 并且所有对象都在堆上动态分配。

    在 C++ 中,对象可以在堆栈或堆上分配内存。当我们使用 new() 分配对象时,对象是在堆上分配的。

    Understanding Memory Management

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      相关资源
      最近更新 更多