在探索了 java 的字符串内部结构之后,我对所谓的“永久空间”感到困惑。我最初的理解是它持有String
literals以及类元数据,如中所述这个问题 https://stackoverflow.com/questions/1279449/what-is-perm-space.
我还读过有关String.intern()
方法及其放置的位置String
进入字符串池,返回对其唯一实例的引用。据我了解,这与 JVM 的永久空间中存在的保存字符串文字的字符串池相同。在我看来,“永久空间”是不可能修改的(毕竟它是永久的,是吗?)。但后来我发现这个问题 https://stackoverflow.com/questions/2431540/garbage-collection-behaviour-for-string-internEJP 对已接受答案的最高投票评论解释说
Intern'd 字符串支持 GC 已经有很多年了。
这意味着 GC 在永久空间上运行,这似乎不是很永久。这如何协调? GC 会检查永久空间中的所有内容吗? GC 是否检查字符串池中的所有内容,包括源中的字符串文字?是否有第二个字符串池用于实习字符串? GC 是否只知道在收集时查看 intern 字符串?或者这个评论是错误的并且实习字符串可以防止它被GC(我希望不是这种情况)?
字符串文字被拘留 http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html. As of Java 7 http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html,HotSpot JVM 将 interned Strings 放入堆中,而不是 permgen。
在java 7之前,hotspot将interned Strings放在permgen中。然而,permgen 中的 interned 字符串被垃圾回收 http://www.codeinstructions.com/2009/01/busting-javalangstringintern-myths.html。显然,permgen 中的类对象也是可收集的 https://stackoverflow.com/questions/3796427/in-java-is-permanent-generation-space-garbage-collected,因此 permgen 中的所有内容都是可收集的,尽管在某些旧 JVM 中默认情况下可能未启用 permgen 收集。
被实习的字符串文字将是声明 Class 对象对实习池中 String 对象的引用。因此,只有引用它的 Class 对象也被收集时,才会收集 interned 文字 String。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)