我知道当我们创建字符串文字时,它会进入permgenspace。我的问题是它是否会存在于jvm的生命周期中,即使该字符串文字是方法本地的。例如,我有以下代码片段: -
private static void testString1(){
String str1="tetingLiteral";
}
private static void testString2(){
String str2="tetingLiteral";
}
现在从主要方法我打电话
testString1();
testString12();
str1和str2将引用相同的内存位置。
我的理解是他们将引用相同的内存位置(即使在方法内部创建字符串文字,它将在jvm的生命周期内保留)。但仍然想确认它,因为我无法以编程方式检查它becoz无法打印字符串内存位置
答案 0 :(得分:9)
来自section 3.10.5 of the Java Language Specification:
此外,字符串文字始终引用类String的相同实例。这是因为字符串文字 - 或者更常见的是作为常量表达式(第15.28节)的值的字符串 - 被“实例化”以便使用String.intern方法共享唯一实例。
(请参阅下面的示例,其中显示字符串实习也适用于不同包中的类。)
答案 1 :(得分:5)
确切的实现是特定于JVM的,但在Oracle Java 7中,字符串文字在堆上,当没有类使用字符串文字时(因为它们已被卸载)可以清除它们。