java - 对实习生字符串、字符串池和永久空间的垃圾收集

标签 java string garbage-collection jvm string-interning

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

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

Intern'd strings have been GC-able for quite some years now.

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

最佳答案

字符串文字 are interned .截至Java 7 ,HotSpot JVM 将 interned Strings 放入堆中,而不是 permgen。

在 Java 7 之前,hotspot 将 interned Strings 放在 permgen 中。然而,interned Strings in permgen were garbage collected .显然,Class objects in permgen are also collectable ,因此 permgen 中的所有内容都是可收集的,尽管在某些旧 JVM 中默认情况下可能未启用 permgen 收集。

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

关于java - 对实习生字符串、字符串池和永久空间的垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18152560/

相关文章:

java - 如何使对象能够被垃圾回收?

Java8 : Matching and mapping with reference to this

Java : Running shell script in background

java - Bundle 的导出包不可见

c++ - 在由换行符分隔的字符串中查找特定文本

c++ - 将十进制美元金额从字符串转换为缩放整数

c - 我如何使用其他变量打印 ascii 代码?

java - 从 Windows 命令行运行时如何请求 JVM 垃圾回收(不是从代码)

php - session 结束时运行脚本

java - 适用于 Android 的 C++ 或 Java?