2011-12-21 62 views
5

我目前正在学习java,堆栈和堆的内存概念,我知道局部变量和方法调用生活在一个叫做栈的地方。和对象住在堆内。但是如果这个局部变量持有一个对象呢?或有一个对象引用?Java哪里有本地变量,对象引用,实例变量

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

它还在栈内吗?以及实例变量存在于何处?请尽可能保持简单。谢谢。

回答

11

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

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

根据转义分析结果,字段被分配给对象的其余部分,所以在堆上或堆栈中。

+0

分配在对象内部吗?或者像堆中的独奏一样? – KyelJmD 2011-12-21 10:14:03

+0

如果该对象是作为实例变量创建的,它仍然属于Escape分析? – KyelJmD 2011-12-21 10:20:45

+0

一个对象在内存中的布局是这样的:8个字节的头,然后是属性。如果实例变量是一个对象,而不是一个基元,那么只有指针被存储在连续的内存块中,并且该对象可以被分配到别处。 – socha23 2011-12-21 10:24:17

2

对象引用变量的工作。就像原始变量一样 - 如果引用声明为局部变量,则它会在stack.else上传递,如果refrence是实例变量,它将进入对象内的堆。