2010-01-20 96 views
0

我有一個方法,兩個局部變量如下,字符串類型的局部變量存儲在堆棧或堆上?

int i=10; 
String test="test"; 

據我所知,因爲這些變量是局部的,只一個specfic方法,這些都應該被存儲在堆棧上,將字符串類型也是存儲在堆棧上?

+0

參考將是,但實際的存儲堆。 – 2010-01-20 04:52:11

回答

0

堆棧幀將包含int的值和String的(引用)值。 String引用值指向的對象(例如,表示字符串的字符,長度等的對象)將存儲在堆中。

(這是可能比較容易在一個圖片來解釋這個......如果有人可以有助於鏈接...)

+0

你的意思是在這裏說10,「測試」將被存儲在堆棧中,並且「測試」4的長度將被存儲在堆中? – 2010-01-20 05:01:35

+0

@Sri:不,「測試」(連同其長度和散列碼以及將其標識爲字符串的信息)將存儲在堆中。只有對所有這些的引用存儲在堆棧中(作爲局部變量)。 – Thilo 2010-01-20 05:03:13

2

變量本身(參考String實例)將被存儲在堆棧上。

String實例(其中包含char[]與實際數據)通常會存儲在堆中。不過,由JVM來優化這一點。它可以是來自permgen池的String,或者如果完成了轉義分析(並且String保證不離開本地作用域),它也可以選擇將它分配到堆棧中。

這是所有對象和數組的情況。只有原語是不同的(因爲它們是作爲值傳遞的,而不是作爲對其他地方分配的數據結構的引用)。

-1

如上所述,引用將在堆棧上。在Sun的JVM中,實際的數據將被存儲在perm gen區域中(因爲所討論的字符串是一個字符串文字),並且也會被添加到駐留在堆上的弱HashMap中。這是Sun JVM中interned字符串的行爲。