2017-08-21 97 views
1

由于JVM将内存分配给方法区域中的静态变量类型。但是,当涉及到静态字符串类型时,它是从方法区域引用堆区域,还是在方法区域本身提供了内存。如果它指向堆区,那么String将具有相同的行为(例如下面的例子)?JVM如何为静态字符串变量分配内存?

例子:

static String s1 = new String("Aman"); 
static String s2 = "Aman"; 
+3

变量是否为“静态”对字符串的存储位置/方式没有影响。 –

+0

这意味着它将变量从方法区域引用到堆中? –

回答

3

您混为一谈的变量s1s2对象他们参考。

对象在堆中。文字"Aman"位于堆的字符串池细分中。

变量是静态的,都在类中。

0

由于JVM将内存分配给方法区域中的静态变量类型。

是的,你是正确的,因为静态变量的类级变量,因为它们是反射数据(类相关的数据,而不是如相关),它们被存储在堆的PermGenSpace>方法区节的一部分,

但是,当涉及到静态字符串类型它与方法区指堆区域 或它在方法区域有本身提供存储器。

查看对象总是只有内存堆积区域,无论如何,但是静态引用变量将存储在方法区域中。

来到你的代码,

static String s1 = new String("Aman");

上面的代码行会创建通过字符串常量“阿曼”两个对象第一个对象,通过新的关键字和第二对象在堆内存,但切记字符串文字将存储在StringConstantPool中,并从StringConstantPool的堆中引用第二个对象,然后将堆中的对象的引用赋值给MethodArea中存在的引用变量。

static String s2 = "Aman";

现在,当编译器执行上面的线,它会检查“祖阿曼”已经在StringConstantPool它不会产生另一个对象,而不是它会返回相同的对象是已经在堆内存到方法区域中的静态参考s2。

我希望这会有所帮助。