String pool创建在Heap的PermGen区或Object区

String pool is created in PermGen area or Object area of Heap

HERE,作者说

3) String pool is created in PermGen area of Heap, garbage collection can occur in perm space but depends upon JVM to JVM. By the way from JDK 1.7 update, String pool is moved to heap area where objects are created.

这样做有什么具体原因吗?我无法在网上找到任何内容。这意味着什么?

在Java 6 天里,所有 interned 字符串都存储在 PermGen 中——堆的固定大小部分,主要用于存储已加载的 类 和字符串池。除了显式驻留的字符串外,PermGen 字符串池还包含您程序中先前使用的所有文字字符串。

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

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

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

迁移到元空间是必要的,因为 PermGen 真的很难调整。

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

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