我目前正在学习java,堆栈和堆的内存概念,我知道局部变量和方法调用都存在于一个叫做堆栈的地方。和对象住在堆里面。但是如果该局部变量包含一个对象呢?或者有对象引用?
public void Something(){
Duck d = new Duck(24);
}
它仍然存在于堆栈中吗?实例变量在哪里生活?请尽量保持简单。谢谢。
答案 0 :(得分:11)
局部变量d
(在堆栈上分配)包含对类Duck
的对象的引用。通常,对象在堆上分配。
Java 6e14增加了对“逃逸分析”的支持。当您使用-XX:+DoEscapeAnalysis
开关启用它时,如果JVM确定在方法中创建了一个对象,仅在该方法中使用,并且无法引用该对象来“转义”该方法 - 也就是说,我们可以确定在方法完成后没有引用该对象--JVM可以在堆栈上分配它(将它的所有字段视为本地变量)。这可能发生在你的例子中。
字段与对象的其余部分一起分配,因此在堆上或堆栈上,取决于转义分析结果。
答案 1 :(得分:2)
对象引用变量有效。就像原始变量一样 - 如果引用被声明为局部变量,那么它将继续执行stack.else,如果refrence是实例变量,它将进入对象内的堆。