哪里分配了变量引用,堆栈还是堆?
我有个问题
例如,当我在一个方法中声明一个变量时会发生什么。
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?