8

在探索了 java 的字符串内部结构之后,我对所谓的“烫发空间”感到困惑。我最初对它的理解是它包含String 文字以及类元数据,如本问题所述。

我还阅读了有关该String.intern()方法的信息,并将Strings 放入字符串池中,返回对其唯一实例的引用。据我了解,这是保存在 JVM 永久空间中的字符串文字的同一个字符串池。在我看来,“烫发空间”似乎不可能是可修改的(毕竟它是永久的,是吗?)。但后来我发现了这个问题,EJP 对已接受答案的最高投票评论解释说

Intern'd 字符串已经支持 GC 好几年了。

暗示 GC 在 perm-space 上运行,这似乎不是很永久。这如何调和?GC 会检查 perm-space 中的所有内容吗?GC 是否检查字符串池中的所有内容,包括来自源的字符串文字?实习生字符串是否有第二个字符串池?GC 是否只知道在收集时查看实习生字符串?或者这个评论是错误的并且实习字符串会阻止它被GC'd(我希望不是这种情况)?

4

1 回答 1

11

字符串文字是 interned。从Java 7开始,HotSpot JVM 将实习字符串放入堆中,而不是 permgen。

在 java 7 之前,热点将实习字符串放在 permgen 中。但是,permgen 中的实习字符串是垃圾收集的。显然,permgen 中的 Class 对象也是 collectable,因此 permgen 中的所有内容都是可收集的,尽管在某些旧 JVM 中默认情况下可能不会启用 permgen 收集。

被实习的字符串文字将是声明类对象持有的对实习池中字符串对象的引用。因此,只有当引用它的 Class 对象也被收集时,才会收集实习文字 String。

于 2013-08-09T18:46:28.147 回答