我目前正在学习java的内存概念,栈和堆,我知道局部变量和方法调用位于一个叫做栈的地方。而对象位于堆内。但是如果局部变量持有一个对象?或者有一个对象引用呢?
public void Something(){ Duck d = new Duck(24); }
它还在栈中吗?示例变量在哪里?请尽量保持简单。谢谢。
dffbzjpn1#
局部变量d(在堆栈上分配)包含对Duck类对象的引用。通常,对象在堆上分配。Java 6 e14增加了对“转义分析”的支持。当您使用-XX:+DoEscapeAnalysis开关启用它时,如果JVM确定某个对象是在某个方法中创建的,则只能在该方法中使用,并且对该对象的引用无法“转义”该方法-也就是说,我们可以确定在方法完成后对象没有被引用- JVM可以在堆栈上分配它(把它的所有字段都当作局部变量)。2在你的例子中可能会发生这种情况。字段是与对象的其余部分一起分配的,因此是在堆上还是在堆栈上,这取决于转义分析的结果。
d
Duck
-XX:+DoEscapeAnalysis
r7knjye22#
对象引用变量的工作原理和基元变量一样a-如果引用被声明为局部变量,它将进入堆栈。否则,如果引用是示例变量,它将进入对象内的堆。
2条答案
按热度按时间dffbzjpn1#
局部变量
d
(在堆栈上分配)包含对Duck
类对象的引用。通常,对象在堆上分配。Java 6 e14增加了对“转义分析”的支持。当您使用
-XX:+DoEscapeAnalysis
开关启用它时,如果JVM确定某个对象是在某个方法中创建的,则只能在该方法中使用,并且对该对象的引用无法“转义”该方法-也就是说,我们可以确定在方法完成后对象没有被引用- JVM可以在堆栈上分配它(把它的所有字段都当作局部变量)。2在你的例子中可能会发生这种情况。字段是与对象的其余部分一起分配的,因此是在堆上还是在堆栈上,这取决于转义分析的结果。
r7knjye22#
对象引用变量的工作原理和基元变量一样a-如果引用被声明为局部变量,它将进入堆栈。否则,如果引用是示例变量,它将进入对象内的堆。