如果我创建任意数量的String对象,JVM是否会耗尽PermGen空间?

时间:2013-10-03 19:09:17

标签: java string memory jvm permgen

假设我编写的程序可以创建大量String个对象并intern()

String someString = param1 + param2;
someString.intern();

这适用于一小组字符串,但如果我尝试创建十亿String s怎么办? (或者十亿亿美元?) 据我所知,JVM在{strong> PermGen 区域为String维护了一个常量池,而 PermGen 没有得到 GC -ed。

因此,如果我在循环中创建了过多的String个对象,但是我删除了对它们的引用,它们会得到 GC -ed(我会用完 PermGen 空间)? String都是唯一的,没有任何重复。

2 个答案:

答案 0 :(得分:8)

在Java 6中,您可以填写PermGen,它将被清理。

在Java 7中,实习字符串不在PermGen中,而是在堆中。

在Java 8中,没有PermGen。

文字池,只包含常量,如果你创建一个新的字符串,它不是文字,所以它首先不在池中。

注意:String文字哈希映射不会调整大小。默认情况下,它通常约为10K元素。当你添加条目时,它变得越来越慢,因为它变成了一个链表的数组。

答案 1 :(得分:3)

没有。你所展示的不是文字语法。

String myString = "a literal String";

将是文字语法。但是,您可以使用String.intern()方法确保所有字符串都放在常量池中。你可以测试自己在实习过量的弦乐时会发生什么。