【问题标题】:Garbage collection on intern'd strings, String Pool, and perm-space实习生字符串、字符串池和 perm-space 上的垃圾收集
【发布时间】:2013-08-11 17:34:24
【问题描述】:

在探索了 java 的字符串内部结构后,我对所谓的“perm 空间”感到困惑。我最初对它的理解是它包含String literals 以及this question 中解释的类元数据。

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

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

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

【问题讨论】:

    标签: java string garbage-collection jvm string-interning


    【解决方案1】:

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

    在 java 7 之前,热点将实习字符串放在 permgen 中。但是,interned Strings in permgen were garbage collected。显然,Class objects in permgen are also collectable,所以 permgen 中的所有内容都是可收集的,尽管在某些旧 JVM 中默认情况下可能不会启用 permgen 收集。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-25
      • 2013-05-30
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      相关资源
      最近更新 更多