在堆栈中还是在堆中分配变量引用的位置?

我有一个问题

例如,当我在方法中声明变量时发生了什么。

void myMethod() {
    Ship myShip = new Ship();
}

在堆栈中还是在堆中分配 myShip 引用的位置?

我在堆栈中思考,但我感到困惑,因为我正在阅读J2ME游戏编程书“Java类被实例化到Java堆上”

所有 java clases ?

提前致谢


答案 1

myShip是对一个对象的引用,是在方法调用堆栈上,它被称为“堆栈”。当一个方法被称为内存块被推到堆栈的顶部时,该内存块有空间用于该方法的所有基元(int,float,boolean等)和对象引用,其中包括方法参数。堆是为实际对象分配内存的位置。ShipmyShip

在堆栈上也是如此,对象在堆上。myShipShip

请注意,每个线程都有自己的堆栈,但共享堆。


答案 2

Java确实以不同的方式做事。引用基本上在堆栈上。对象的内存按为堆传递的内容进行分配。但是,可分配内存的实现与 C/C++ 模型中实现堆的方式不太一样。

当您创建这样的新对象时,它有效地将名称放入该作用域的引用表中。这很像指向C++中的对象的指针。当它超出范围时,该引用将丢失;分配的内存不再被引用,并且可以进行垃圾回收。


推荐