字符串类型的局部变量存储在堆栈或堆上?

时间:2010-01-20 04:51:28

标签: java

我在方法中有两个局部变量,如下所示,

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

据我所知,这些变量只是一个特定的方法本地化,这些变量应存储在堆栈中,字符串类型是否也存储在堆栈中?

3 个答案:

答案 0 :(得分:2)

变量本身(对String实例的引用)将存储在堆栈中。

String实例(包含带有实际数据的char[])通常会存储在堆中。但是,由JVM来优化它。它可以是permgen池中的String,或者如果完成了转义分析(并且保证String不会离开本地范围),它也可以选择在堆栈上分配它。

所有对象和数组都是这种情况。只有原语是不同的(因为它们作为值传递,而不是作为对其他地方分配的数据结构的引用)。

答案 1 :(得分:0)

堆栈帧将包含int的值和String的(引用)值。 String引用值指向的对象(例如表示字符串的字符,长度等的东西)将存储在堆中。

(在图片中解释这个问题可能最容易......如果有人可以提供链接......)

答案 2 :(得分:-1)

如上所述,引用将在堆栈上。在Sun的JVM中,实际数据将存储在perm gen区域中(因为所讨论的String是一个字符串文字),并且还会被添加到驻留在堆上的弱HashMap中。这是Sun JVM中实习字符串的行为。