2013-03-24 35 views
3

我知道當我們創建字符串時,它會進入permgenspace。我的問題是,即使該字符串文本是方法本地的,它會在jvm的生命週期中存在。例如,我有下面的代碼片斷: -爲本地字符串文字分配內存嗎?

private static void testString1(){ 
     String str1="tetingLiteral"; 
    } 


private static void testString2(){ 
     String str2="tetingLiteral"; 
    } 

現在從主方法我打電話

testString1(); 
testString12(); 

將STR1和STR2將指同一存儲器位置。

我的理解是他們會引用相同的內存位置(即使字符串文字是在方法內部創建的,它仍然會保留在jvm的一生中)。但還是想確認一下,因爲我無法編程檢查becoz沒有辦法打印字符串存儲位置

+1

有兩種獲取有關字符串內存位置信息的方法。 (1)==兩個字符串引用的比較,如果它們都是null或者都引用相同的String對象,則爲true。 (2)'System.identityHashCode'儘可能爲每個不同的對象返回一個不同的值。 – 2013-03-24 09:08:42

回答

9

section 3.10.5 of the Java Language Specification

而且,文字始終是一個字符串是指String類的同一個實例。這是因爲字符串文字 - 或者更一般地說是常量表達式(§15.28)值的字符串 - 被「實施」,以便使用方法String.intern共享唯一實例。

(,看看下面的例子,這表明串在不同包中的類之間的實習作品,太。)

5

確切的實現是JVM具體,但在甲骨文的Java 7中,字符串文字是在堆,並且可以在沒有類使用字符串文字時清理(因爲它們已被卸載)

+0

這是否意味着它們將隨着正常的GC運行一起被清除? – emilly 2013-03-24 09:35:53

+0

我懷疑他們只能在Full GC上清理。在Java 8中,permgen將被移除,並且類也將堆在堆上。 – 2013-03-24 09:41:45

+0

彼得還有一件事情,知道爲什麼java 7在堆上存儲字符串文字的原因會有幫助(它是becoz字符串文字是permgen錯誤的最大貢獻者之一)?此外,爲什麼在Java 8中,permgen將被刪除,並且類也將堆在堆上? – emilly 2013-03-24 09:49:19