Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java哪里有局部变量、对象引用、实例变量_Java_Memory Management_Jvm_Heap_Virtual Machine - Fatal编程技术网

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

我目前正在学习java的内存概念、堆栈和堆,我知道局部变量和方法调用存在于一个名为堆栈的地方。对象生活在一个堆中。但是如果这个局部变量包含一个对象呢?或者有对象引用

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

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

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

Java6E14增加了对“转义分析”的支持。当您使用
-XX:+DoEscapeAnalysis
开关启用它时,如果JVM确定一个对象是在一个方法中创建的,只在该方法中使用,并且没有办法引用该对象来“转义”该方法-也就是说,我们可以确保该对象在方法完成后没有被引用-JVM可以在堆栈上分配它(将其所有字段视为局部变量)。在您的示例中可能会出现这种情况


字段与对象的其余部分一起分配,在堆上或堆栈上也是如此,这取决于转义分析结果。

对象引用变量起作用。与原始变量一样,如果引用声明为局部变量,它将进入堆栈。否则,如果引用是实例变量,它将进入对象内的堆。

al位于它们所在的对象内部?或者像堆中的solo一样?如果对象被创建为实例变量,它还会属于转义分析吗?内存中对象的布局如下:8字节头,然后是属性。如果实例变量是对象,而不是基元,那么只有指针存储在内存中连续内存块,对象可以分配到其他位置。根据发行说明()堆栈分配对象的实例变量被视为局部变量,因此我猜它们将在堆栈上进行alo分配。好的,谢谢。现在我有理由升级我的java虚拟机。我没有更新它,因为我发现没有任何更改,但我猜我错了。谢谢大家。