2017-08-21 101 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。

我希望這會有所幫助。