在探索了 java 的字符串内部结构之后,我对所谓的“烫发空间”感到困惑。我最初对它的理解是它包含String
文字以及类元数据,如本问题所述。
我还阅读了有关该String.intern()
方法的信息,并将String
s 放入字符串池中,返回对其唯一实例的引用。据我了解,这是保存在 JVM 永久空间中的字符串文字的同一个字符串池。在我看来,“烫发空间”似乎不可能是可修改的(毕竟它是永久的,是吗?)。但后来我发现了这个问题,EJP 对已接受答案的最高投票评论解释说
Intern'd 字符串已经支持 GC 好几年了。
暗示 GC 在 perm-space 上运行,这似乎不是很永久。这如何调和?GC 会检查 perm-space 中的所有内容吗?GC 是否检查字符串池中的所有内容,包括来自源的字符串文字?实习生字符串是否有第二个字符串池?GC 是否只知道在收集时查看实习生字符串?或者这个评论是错误的并且实习字符串会阻止它被GC'd(我希望不是这种情况)?