假设我编写的程序可以创建大量String
个对象并intern()
:
String someString = param1 + param2;
someString.intern();
这适用于一小组字符串,但如果我尝试创建十亿String
s怎么办? (或者十亿亿美元?)
据我所知,JVM在{strong> PermGen 区域为String
维护了一个常量池,而 PermGen 没有得到 GC -ed。
因此,如果我在循环中创建了过多的String
个对象,但是我删除了对它们的引用,它们会得到 GC -ed(我会用完 PermGen 空间)? String
都是唯一的,没有任何重复。
答案 0 :(得分:8)
在Java 6中,您可以填写PermGen,它将被清理。
在Java 7中,实习字符串不在PermGen中,而是在堆中。
在Java 8中,没有PermGen。
文字池,只包含常量,如果你创建一个新的字符串,它不是文字,所以它首先不在池中。
注意:String文字哈希映射不会调整大小。默认情况下,它通常约为10K元素。当你添加条目时,它变得越来越慢,因为它变成了一个链表的数组。
答案 1 :(得分:3)
没有。你所展示的不是文字语法。
String myString = "a literal String";
将是文字语法。但是,您可以使用String.intern()
方法确保所有字符串都放在常量池中。你可以测试自己在实习过量的弦乐时会发生什么。