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

Kye*_*JmD 5 java heap jvm memory-management virtual-machine

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

public void Something(){
        Duck d = new Duck(24);
}
Run Code Online (Sandbox Code Playgroud)

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

soc*_*a23 11

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

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

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