ibe*_*rck 11 java heap concurrency stack
我有个问题
例如,当我在方法中声明变量时会发生什么.
void myMethod() { Ship myShip = new Ship(); }
在堆栈或堆中分配myShip引用的位置在哪里?
我认为在堆栈中我很困惑,因为我正在阅读J2ME游戏编程书"Java类被实例化到Java堆上"
所有的java clases?
提前致谢
nas*_*ash 24
myShip
是Ship
对象的引用,myShip
位于方法调用堆栈上,称为"堆栈".当一个方法被调用时,一块内存被推到堆栈顶部,该内存块有所有基元(int,float,boolean等)的空间和方法的对象引用,其中包括方法参数.堆是分配实际对象的内存的地方.
所以myShip
在堆栈上,Ship
对象在堆上.
请注意,每个线程都有自己的堆栈但共享堆.
Cha*_*tin 13
Java确实做的事情有点不同.所述参考是基本上在堆栈中.对象的内存分配在堆的传递中.但是,可分配内存的实现与在C/C++模型中实现堆的方式不太相似.
当您创建这样的新对象时,它会有效地将名称放入该范围的引用表中.这就像是指向C++中对象的指针.当它超出范围时,该引用就会丢失; 分配的内存不再被引用,可以进行垃圾回收.
目前,所有Java对象都在堆上分配.有人说Java 7可能会进行转义分析并能够在堆栈上进行分配,但我不知道该提案是否已经完成.这是RFE.
编辑:显然,它已经在JDK 7的早期版本中.(文章说它也将在JDK 6u14中,但我找不到确认.)