Java哪里有局部变量、对象引用、实例变量
我目前正在学习java的内存概念、堆栈和堆,我知道局部变量和方法调用存在于一个名为堆栈的地方。对象生活在一个堆中。但是如果这个局部变量包含一个对象呢?或者有对象引用Java哪里有局部变量、对象引用、实例变量,java,memory-management,jvm,heap,virtual-machine,Java,Memory Management,Jvm,Heap,Virtual Machine,我目前正在学习java的内存概念、堆栈和堆,我知道局部变量和方法调用存在于一个名为堆栈的地方。对象生活在一个堆中。但是如果这个局部变量包含一个对象呢?或者有对象引用 public void Something(){ Duck d = new Duck(24); } 它是否仍然存在于堆栈中?实例变量在哪里?请尽量简单。谢谢。局部变量d(在堆栈上分配)包含对类Duck对象的引用。通常,对象是在堆上分配的 Java6E14增加了对“转义分析”的支持。当您使用-XX:+DoEscape
public void Something(){
Duck d = new Duck(24);
}
它是否仍然存在于堆栈中?实例变量在哪里?请尽量简单。谢谢。局部变量
d
(在堆栈上分配)包含对类Duck
对象的引用。通常,对象是在堆上分配的
Java6E14增加了对“转义分析”的支持。当您使用-XX:+DoEscapeAnalysis
开关启用它时,如果JVM确定一个对象是在一个方法中创建的,只在该方法中使用,并且没有办法引用该对象来“转义”该方法-也就是说,我们可以确保该对象在方法完成后没有被引用-JVM可以在堆栈上分配它(将其所有字段视为局部变量)。在您的示例中可能会出现这种情况
字段与对象的其余部分一起分配,在堆上或堆栈上也是如此,这取决于转义分析结果。对象引用变量起作用。与原始变量一样,如果引用声明为局部变量,它将进入堆栈。否则,如果引用是实例变量,它将进入对象内的堆。al位于它们所在的对象内部?或者像堆中的solo一样?如果对象被创建为实例变量,它还会属于转义分析吗?内存中对象的布局如下:8字节头,然后是属性。如果实例变量是对象,而不是基元,那么只有指针存储在内存中连续内存块,对象可以分配到其他位置。根据发行说明()堆栈分配对象的实例变量被视为局部变量,因此我猜它们将在堆栈上进行alo分配。好的,谢谢。现在我有理由升级我的java虚拟机。我没有更新它,因为我发现没有任何更改,但我猜我错了。谢谢大家。