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更高版本的高级细节一无所知。