Java在哪里做局部变量,对象引用,实例变量

我目前正在学习java,堆栈和堆的内存概念,我知道局部变量和方法调用都存在于一个叫做堆栈的地方。 和对象住在堆里面。 但是如果该局部变量包含一个对象呢? 或者有对象参考?

public void Something(){ Duck d = new Duck(24); } 

它仍然存在于堆栈中吗? 实例变量在哪里? 请尽量保持简单。 谢谢。

局部变量d (在堆栈上分配)包含对Duck类对象的引用。 通常,对象在堆上分配。

Java 6e14增加了对“逃逸分析”的支持。 当您使用-XX:+DoEscapeAnalysis开关启用它时,如果JVM确定在方法中创建了一个对象,仅在该方法中使用,并且无法引用该对象来“转义”该方法 – 也就是说,我们可以确定在方法完成后没有引用该对象–JVM可以在堆栈上分配它(将所有字段视为本地变量)。 这可能发生在你的例子中。

根据转义分析结果,字段与对象的其余部分一起分配,因此在堆上或堆栈上。

对象引用变量有效。 就像原始变量一样 – 如果引用被声明为局部变量,则它继续在stack.else上,如果refrence是实例变量,它将进入对象内的堆。