jvm Java Where do局部变量,对象引用,示例变量

mgdq6dx1  于 2022-11-07  发布在  Java
关注(0)|答案(2)|浏览(157)

我目前正在学习java的内存概念,栈和堆,我知道局部变量和方法调用位于一个叫做栈的地方。而对象位于堆内。但是如果局部变量持有一个对象?或者有一个对象引用呢?

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

它还在栈中吗?示例变量在哪里?请尽量保持简单。谢谢。

dffbzjpn

dffbzjpn1#

局部变量d(在堆栈上分配)包含对Duck类对象的引用。通常,对象在堆上分配。
Java 6 e14增加了对“转义分析”的支持。当您使用-XX:+DoEscapeAnalysis开关启用它时,如果JVM确定某个对象是在某个方法中创建的,则只能在该方法中使用,并且对该对象的引用无法“转义”该方法-也就是说,我们可以确定在方法完成后对象没有被引用- JVM可以在堆栈上分配它(把它的所有字段都当作局部变量)。2在你的例子中可能会发生这种情况。
字段是与对象的其余部分一起分配的,因此是在堆上还是在堆栈上,这取决于转义分析的结果。

r7knjye2

r7knjye22#

对象引用变量的工作原理和基元变量一样a-如果引用被声明为局部变量,它将进入堆栈。否则,如果引用是示例变量,它将进入对象内的堆。

相关问题