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

Java 字符串类型的局部变量存储在堆栈或堆上?,java,Java,我在一个方法中有两个局部变量,如下所示 int i=10; String test="test"; 据我所知,由于这些变量仅对特定方法是局部变量,因此应将其存储在堆栈上,字符串类型是否也存储在堆栈上?堆栈框架将包含int值和字符串的(参考)值。字符串引用值指向的对象(例如,表示字符串字符、长度等的对象)将存储在堆中 (在图片中解释这一点可能最容易…如果有人可以提供链接…变量本身(对字符串实例的引用)将存储在堆栈上 字符串实例(包含实际数据的char[])通常存储在堆中。不过,这要由JVM来优化

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

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

据我所知,由于这些变量仅对特定方法是局部变量,因此应将其存储在堆栈上,字符串类型是否也存储在堆栈上?

堆栈框架将包含int值和字符串的(参考)值。字符串引用值指向的对象(例如,表示字符串字符、长度等的对象)将存储在堆中

(在图片中解释这一点可能最容易…如果有人可以提供链接…

变量本身(对字符串实例的引用)将存储在堆栈上

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


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

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

引用将是,但实际的存储堆。您的意思是说10,“test”将存储在堆栈中,“test”4的长度将存储在堆中?@Sri:No,“test”(以及其长度和哈希代码以及将其标识为字符串的信息)将存储在堆中。堆栈中只存储对所有这些的引用(作为局部变量)。