【发布时间】:2014-11-16 05:25:08
【问题描述】:
作为学习的一部分,从下面的例子中,
我的问题:
有了数组声明/定义的给定内存布局,我想了解,哪个内存空间将成为堆栈空间和堆空间的一部分?准确地说,下面的内存空间(上图的一部分)在哪里?
【问题讨论】:
标签: java jvm heap-memory stack-memory
作为学习的一部分,从下面的例子中,
我的问题:
有了数组声明/定义的给定内存布局,我想了解,哪个内存空间将成为堆栈空间和堆空间的一部分?准确地说,下面的内存空间(上图的一部分)在哪里?
【问题讨论】:
标签: java jvm heap-memory stack-memory
对象总是在堆上声明。只有对对象的引用通过方法变量和参数在堆栈中传递。
因此,您在上面绘制的对象图将存储在堆中,并且对这些对象的引用仅在方法调用期间存在于堆栈中,当且仅当它们具有指向上述对象的参数或变量时图表。
JVM 优化可能会在底层略有不同,例如使用寄存器而不是堆栈或内联对象,因为它可以被证明永远不会逃避方法调用等。然而,这些优化可能会发生也可能不会发生,它们是从 Java 语言级别看不到。因此,Java 语言的上述规则成立,堆上的对象和堆栈上的方法参数/字段。参数和字段永远不能保存对象,只能引用对象。
【讨论】:
THUMB-RULE - 所有对象都在堆上创建,无论它们在哪里实例化。
【讨论】: