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

时间:2013-03-24 08:59:52

标签: java string memory garbage-collection

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

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


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

现在从主要方法我打电话

testString1();
testString12();

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

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

2 个答案:

答案 0 :(得分:9)

来自section 3.10.5 of the Java Language Specification

  

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

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

答案 1 :(得分:5)

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