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

Ada*_*old 2 java memory string jvm permgen

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

String someString = param1 + param2;
someString.intern();
Run Code Online (Sandbox Code Playgroud)

这对于一小组字符串来说很好,但是如果我尝试创建十亿个字符串String呢?(或者说亿亿亿?)据我所知,JVM 在PermGen区域为s 维护一个常量池,而PermGen没有得到GC -ed.String

因此,如果我String在循环中创建了过多的对象,但是我删除了对它们的引用,那么它们将得到GC -ed(我将用尽PermGen空间)吗?这些String都是独一无二的,没有任何重复.

Pet*_*rey 8

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

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

在Java 8中,没有PermGen.

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

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