JVM在原始类型的声明中分配内存,但不为非原始类型分配内存?

时间:2015-09-27 16:23:11

标签: java

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

当我们写作时,

myclass myobject;

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

int a;

它声明变量a并且还在堆栈中分配等于int大小的内存。

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

我提出了类似的疑问here

4 个答案:

答案 0 :(得分:11)

  

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

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

  

以堆栈4字节分配的内存

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

  

这是引用变量也需要4字节的大小

object = new MyClass();

  

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

答案 1 :(得分:0)

  

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

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

来到实际问题,是的。对于原语天气你初始化它或者稍后,一旦你声明,内存分配。

这是基元的数据量

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

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

答案 2 :(得分:0)

在java中,变量的声明并不意味着分配内存空间,但意味着此变量可以在以后保存具有相同类型的类(或子类)的对象的引用。

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

在您写下时分配内存空间:

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

现在myObject有一个引用指向新MyClass()的结果对象,该对象的大小取决于其类声明中的数据字段。

<强>结论

声明

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

MyClass myObject; //具有空值

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

我希望这对你有帮助:)。

答案 3 :(得分:0)

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

在C ++中,

可以在堆栈或堆上为对象分配内存。当我们使用new()分配对象时,该对象将在堆上分配。

Understanding Memory Management