当我们说内部字符串(interned strings)存储在永久代区域时,这是否也适用于字符串字面量?还是只适用于通过intern()方法进行内部化的字符串?
实际上,博客文章通常会说字符串池包含对字符串对象的引用,而实际的字符串对象则存储在堆中的某个位置。此外,人们非常困惑永久代是在堆内还是在堆外(我使用了jconsole,它显示永久代与堆不同。许多文章将其视为堆的一部分,而其他文章则认为它是不同的)。
编辑: 另外,当我运行以下代码时:
public class stringtest2{
public static void main(String args[]){
int i=0;
List<String> list=new ArrayList<String>();
while(true){
String s="hello"+i;
String s1=i+"hello";
String s2=i+"hello"+i;
System.out.println(s);
s.intern();
s1.intern();
s2.intern();
list.add(s);
list.add(s1);
list.add(s2);
i++;
}
}
}
我原本期待看到的是 Java.lang.OutOfMemoryError: PermGen space
但是我得到了:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2760)
at java.util.Arrays.copyOf(Arrays.java:2734)
at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
at java.util.ArrayList.add(ArrayList.java:351)
at stringtest2.main(stringtest2.java:20)
应该是 Java.lang.OutOfMemoryError: PermGen space
吧
Java.lang.OutOfMemoryError: PermGen space
。 - a Learnerjava.util.Arrays.copyOf(Arrays.java:2760)
抛出的,当 ArrayList 需要扩展其容量时调用该方法 - 因此堆空间错误是正常的。 - assylias