作为学习的一部分,从下面的例子中,
我的问题:
在给出数组声明/定义的内存布局时,我想了解一下,哪个内存空间将成为Stack space&的一部分。堆空间?确切地说,下面的存储空间(上图中的一部分)位于何处?
答案 0 :(得分:2)
始终在堆上声明对象。只有对象的引用通过方法变量和参数在堆栈中过去。
因此,您在上面绘制的对象图将存储在堆上,并且这些对象的引用只会在方法调用期间存在于堆栈中,当且仅当它们具有指向上述对象的参数或变量时图。
JVM优化可能会略有不同,例如使用寄存器而不是堆栈或内联对象,因为它可以显示为永远不会转义方法调用等。但是这些优化可能会也可能不会发生,并且它们是从Java语言级别看不到。因此,Java语言的上述规则包含堆上的对象和堆栈上的方法参数/字段。参数和字段永远不能保存对象,只能引用对象。
答案 1 :(得分:0)
THUMB-RULE - 所有对象都在堆上创建,而不管它们在何处被实例化。