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

Java 如果我创建任意数量的字符串对象,JVM是否会耗尽PermGen空间?,java,string,memory,jvm,permgen,Java,String,Memory,Jvm,Permgen,假设我编写了一个程序,创建了许多String对象和intern()对象: String someString = param1 + param2; someString.intern(); 这对于一小部分字符串来说很好,但是如果我尝试创建一个十亿字符串s呢?(或者说是10亿*10亿?) 据我所知,JVM在PermGen区域中为Strings维护一个常量池,并且PermGen不会得到GC-ed 因此,如果我在一个循环中创建了过多的String对象,但我删除了对它们的引用,它们会得到GC-ed吗(

假设我编写了一个程序,创建了许多
String
对象和
intern()
对象:

String someString = param1 + param2;
someString.intern();
这对于一小部分字符串来说很好,但是如果我尝试创建一个十亿
字符串
s呢?(或者说是10亿*10亿?) 据我所知,JVM在PermGen区域中为
String
s维护一个常量池,并且PermGen不会得到GC-ed


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

否。您显示的不是文字语法

String myString = "a literal String";

将是字面语法。但是,您可以使用
String.intern()
方法确保所有字符串都放在常量池中。您可以自己测试当您插入过多的字符串时会发生什么情况。

在Java 6中,您可以填充PermGen并将其清理干净

在Java7中,插入的字符串不在PermGen中,而是在堆中

在Java8中,没有PermGen

文字池,仅包含常量,如果创建新字符串,则它不是文字,因此它首先不在池中


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

它们在Java 7中存储在哪里?该死,我对Java更高版本的高级细节一无所知。