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

时间:2015-01-23 10:24:34

标签: java string jvm java-memory-model

HERE,作者说的是

  

3)字符串池是在堆的垃圾收集的PermGen区域中创建的   可以在perm空间中发生,但依赖于JVM到JVM。顺便说一句   JDK 1.7更新,字符串池被移动到对象所在的堆区域   创建

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

2 个答案:

答案 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/