2011-12-21 59 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是實例變量,它將進入對象內的堆。