我在方法中有两个局部变量,如下所示,
int i=10;
String test="test";
据我所知,这些变量只是一个特定的方法本地化,这些变量应存储在堆栈中,字符串类型是否也存储在堆栈中?
答案 0 :(得分:2)
变量本身(对String实例的引用)将存储在堆栈中。
String实例(包含带有实际数据的char[]
)通常会存储在堆中。但是,由JVM来优化它。它可以是permgen池中的String,或者如果完成了转义分析(并且保证String不会离开本地范围),它也可以选择在堆栈上分配它。
所有对象和数组都是这种情况。只有原语是不同的(因为它们作为值传递,而不是作为对其他地方分配的数据结构的引用)。
答案 1 :(得分:0)
堆栈帧将包含int的值和String的(引用)值。 String引用值指向的对象(例如表示字符串的字符,长度等的东西)将存储在堆中。
(在图片中解释这个问题可能最容易......如果有人可以提供链接......)
答案 2 :(得分:-1)
如上所述,引用将在堆栈上。在Sun的JVM中,实际数据将存储在perm gen区域中(因为所讨论的String是一个字符串文字),并且还会被添加到驻留在堆上的弱HashMap中。这是Sun JVM中实习字符串的行为。