本地字符串文字的内存分配?

emi*_*lly 4 java memory string garbage-collection

我知道当我们创建字符串文字时,它会进入permgenspace.我的问题是它是否会存在于jvm的生命周期中,即使该字符串文字是方法本地的.例如,我有以下代码片段: -

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


private static void testString2(){
        String str2="tetingLiteral";
    }
Run Code Online (Sandbox Code Playgroud)

现在从主要方法我打电话

testString1();
testString12();
Run Code Online (Sandbox Code Playgroud)

将str1和str2引用到相同的内存位置.

我的理解是他们将引用相同的内存位置(即使在方法内创建字符串文字,它将在jvm的生命周期内保留).但仍然想确认它,因为我无法以编程方式检查它becoz无法打印字符串内存位置

Jon*_*eet 9

Java语言规范的3.10.5节:

此外,字符串文字始终引用类String的相同实例.这是因为字符串文字 - 或者更常见的是作为常量表达式(第15.28节)的值的字符串 - 被"实例化"以便使用String.intern方法共享唯一实例.

(请参阅下面的示例,其中显示字符串实习也适用于不同包中的类.)


Pet*_*rey 5

确切的实现是特定于JVM的,但在Oracle Java 7中,字符串文字在堆上,当没有类使用字符串文字时(因为它们已被卸载)可以清除它们