哪里分配了变量引用,堆栈还是堆?

我有个问题

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

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

哪里分配了myShip参考,堆栈中还是堆中?

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

所有的java clases?

提前致谢


myShip是对Ship对象的引用, myShip位于方法调用堆栈上,称为“堆栈”。 当一个方法被调用时,一个内存块被压入堆栈顶部,该内存块为所有基元(int,float,boolean等)和方法的对象引用(包括方法参数)提供空间。 堆是分配实际对象的内存的地方。

所以myShip在栈上, Ship对象在堆上。

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


Java真的有点不同。 参考基本上在堆栈上。 对象的内存分配在堆的传递中。 然而,可分配内存的实现并不像C / C ++模型中实现堆的方式。

当你创建一个新的对象时,它会将该名称有效地放入该范围的引用表中。 这很像是一个指向C ++中的对象的指针。 当它超出范围时,该参考就会丢失; 分配的内存不再被引用,并且可以被垃圾收集。


目前,所有Java对象都分配在堆上。 有人说Java 7可能会逃避分析并能够在堆栈上分配,但我不知道该提案是否已完成。 这是RFE。

编辑:显然,它已经在JDK 7的早期版本中。(文章说它也将在JDK 6u14中,但我无法找到确认。)

链接地址: http://www.djcxy.com/p/82817.html

上一篇: Where is allocated variable reference, in stack or in the heap?

下一篇: Destructor not deleting allocated memory