HERE,作者说的是
3)字符串池是在堆的垃圾收集的PermGen区域中创建的 可以在perm空间中发生,但依赖于JVM到JVM。顺便说一句 JDK 1.7更新,字符串池被移动到对象所在的堆区域 创建
有什么具体原因可以解决吗?我无法在网上找到任何内容。有什么影响?
答案 0 :(得分:7)
由于PermGen很难调整,因此转向Metaspace是必要的。
此外,很难确定PermGen的大小,因为大小取决于很多因素,例如类的总数,常量池的大小,方法的大小等。
此外,HotSpot中的每个垃圾收集器都需要专门的代码来处理PermGen中的元数据。从PermGen中分离元数据不仅允许Metaspace的无缝管理,而且还允许改进,例如简化完整垃圾收集以及将来并发分配类元数据。
答案 1 :(得分:5)
在Java 6天内,所有实习字符串都存储在PermGen中 - 堆的固定大小部分主要用于存储加载的类和字符串池。除了显式内部字符串之外,PermGen字符串池还包含程序中先前使用的所有文字字符串。
Java 6中字符串池的最大问题是它的位置--PermGen。 PermGen具有固定大小,无法在运行时扩展。您可以使用-XX:MaxPermSize = N选项设置它。
工程师对Java 7中的字符串池逻辑进行了非常重要的更改 - 字符串池已重新定位到堆中。这意味着您不再受限于单独的固定大小的内存区域。所有字符串现在都位于堆中,与大多数其他普通对象一样,它允许您在调整应用程序时仅管理堆大小。
参考:http://java-performance.info/string-intern-in-java-6-7-8/