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

ibe*_*rck 11 java heap concurrency stack

我有个问题

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

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

在堆栈或堆中分配myShip引用的位置在哪里?

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

所有的java clases?

提前致谢

nas*_*ash 24

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

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

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


Cha*_*tin 13

Java确实做的事情有点不同.所述参考是基本上在堆栈中.对象的内存分配在堆的传递中.但是,可分配内存的实现与在C/C++模型中实现堆的方式不太相似.

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

  • @CharlieMartin:你错了,<code>船只; </ code>不构造船!该变量刚刚初始化为null. (3认同)
  • 如果它是局部变量(即方法中的变量),则_not_初始化为"null",除非您明确地将其设置为"null"! (2认同)

Mic*_*ers 6

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

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

  • 然而,转义分析不会影响代码的语义,因此永远不需要依赖或假设其存在. (2认同)
  • @bdonlan:正确,但逃避分析(自Java SE 6u23以来实施,顺便说一句)确实有助于今天的Java不是15年前的跛脚. (2认同)