字符串池是在PermGen区域或Heap的Object区域中创建的

这是作者说的

3)字符串池是在Heap的PermGen区域中创建的,垃圾收集可以在perm空间中进行,但依赖于JVM到JVM。 顺便提一下,从JDK 1.7更新,String池被移动到创建对象的堆区域。

它有什么具体原因吗? 我无法在网上找到任何内容。 有什么影响?

由于PermGen很难调整,因此转向Metaspace是必要的。

此外,很难确定PermGen的大小,因为它的大小取决于很多因素,例如类的总数,常量池的大小,方法的大小等。

此外,HotSpot中的每个垃圾收集器都需要专门的代码来处理PermGen中的元数据。 从PermGen中分离元数据不仅允许Metaspace的无缝管理,而且还允许改进,例如简化完整垃圾收集以及将来并发分配类元数据。

在Java 6天内,所有实习字符串都存储在PermGen中 – 堆的固定大小部分主要用于存储加载的类和字符串池。 除了显式实现的字符串外,PermGen字符串池还包含程序中先前使用的所有文字字符串。

Java 6中字符串池的最大问题是它的位置–PermGen。 PermGen具有固定大小,无法在运行时扩展。 您可以使用-XX:MaxPermSize = N选项进行设置。

工程师对Java 7中的字符串池逻辑进行了非常重要的更改 – 字符串池被重定位到堆中。 这意味着您不再受限于单独的固定大小的内存区域。 所有字符串现在都位于堆中,与大多数其他普通对象一样,它允许您在调整应用程序时仅管理堆大小。

参考: http : //java-performance.info/string-intern-in-java-6-7-8/