2013-03-24 61 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