Rya*_*ing 7 java string garbage-collection jvm string-interning
在探索了java的字符串内部结构后,我对所谓的"烫发空间"感到困惑.我最初的理解是它保留了String 文字以及类元数据,如本问题所述.
我还阅读了有关该String.intern()方法的内容,并将其String放入String Pool中,返回对它的唯一实例的引用.我的理解是,这是与JVM的perm空间中存在的字符串文字相同的字符串池.对我来说,"烫发空间"可以修改是不可能的(毕竟它是永久性的,是吗?).但后来我发现这个问题,EJP对接受的答案的最高投票评论解释了这一点
现在,实习生的字符串已经可以用GC了.
暗示GC在perm空间上运行,这似乎不是永久性的.这如何调和?GC是否检查了烫发空间中的所有内容?GC是否检查字符串池中的所有内容,包括源中的字符串文字?内联字符串是否有第二个字符串池?GC是否只知道在收集时查看实习生的字符串?或者这个评论是错误的并且实际上是一个字符串阻止它成为GC'd(我希望不是这种情况)?
小智 10
字符串文字是实习的.从Java 7开始,HotSpot JVM将实际的字符串放入堆中,而不是permgen.
在java 7之前,hotspot将perings中的字符串放入.然而,在permgen实习的字符串被垃圾收集.显然,permgen中的Class对象也是可收集的,因此permgen中的所有内容都是可收集的,但在某些旧JVM中默认情况下可能不会启用permgen集合.
被实习的字符串文字将是由实体池中的String对象声明的Class对象所持有的引用.因此,只有在收集了引用它的Class对象时才会收集实习文字字符串.