探索了Java的字符串内部结构之后,我对所谓的“烫发空间”感到困惑。我最初对它的理解是,它包含String
字面值
以及此问题中说明的类元数据。
我还阅读了有关该String.intern()
方法的信息,并将其String
放入字符串池,返回对该方法唯一实例的引用。据我了解,这是与存在于JVM的perm空间中的String字符串相同的字符串池。在我看来,“烫发空间”是不可能修改的(毕竟它是永久的,是吗?)。但是,然后我发现了这个问题,EJP对已接受答案的最高投票意见解释了这一点:
实习字符串已经可以使用GC了很多年了。
暗示GC在烫发空间上运行,这似乎不是永久的。如何调和?GC是否检查烫发空间中的所有内容?GC是否检查字符串池中的所有内容,包括源中的字符串文字?是否有第二个用于内部字符串的字符串池?GC收集时是否只知道查看内部字符串?还是此注释是错误的,并且在字符串中进行内插会阻止将其进行GC处理(我希望情况并非如此)?
字符串文字是interned。从Java
7开始
,HotSpot
JVM将内部字符串放置在堆中,而不是permgen。
在Java
7之前,hotspot将内部字符串放入permgen中。但是,permgen中的被锁住的Strings被垃圾收集了。显然,permgen中的Class对象也是可收集的,因此permgen中的所有内容都是可收集的,尽管在某些旧的JVM中可能默认情况下未启用permgen收集。
被嵌入的字符串文字将是由声明的Class对象持有的对内部池中String对象的引用。因此,只有在还收集了引用了它的Class对象的情况下,才收集实习文本字符串。
问题内容: 我知道子字符串内部会保留原始字符串的引用。 但是通过显式定义为,sample1和sample2是否可用于垃圾回收? 我记得在某处看到是否将父对象显式设置为所有子值都可用于垃圾回收。这对上述内容有好处吗?我只是好奇这是否是父母子女关系的情景?如果不是,将这项事业或者是可用于垃圾回收? 问题答案: 首先要说的是,垃圾回收不会立即发生。因此,分配任何东西不会/不会 导致 垃圾回收。什么是 可
问题内容: 我正在阅读有关垃圾收集的信息,当我搜索字符串文字垃圾收集时,搜索结果令人困惑。 我需要澄清以下几点: 如果在编译时将字符串定义为文字字符串,那么是否会对其进行垃圾回收? 如果使用实习方法,那么它会被垃圾回收吗?在第1点中,它也将与文字区别对待。 有人提到只有在卸载类时才会对文字进行垃圾回收吗?是否有道理,因为我认为永远不会卸课。 问题答案: 如果在编译时将字符串定义为文字字符串,那么是
问题内容: 空字符串()和空字符串()有什么区别? 这就是我所拥有的: 这是什么意思? 问题答案: 表示将空值分配给。在这种情况下,与相同,将按预期产生。 表示将()或“完全没有值”分配给。因此,这与相同,它将产生一个,因为您无法在Java中对变量(指针或类似物)调用方法。 还有一点,声明 实际上具有与以下功能相同的效果: 鉴于 如前所述,是另一回事。
我在网站上读到了这个问题:java内存池是如何划分的?我想知道“字符串常量池”属于这些扇区中的哪一个? 还有池中的文字是否曾经被 GC 化? 方法从池中返回文字的基链接。 如果池确实被 GC 处理,那么它不会对字符串池的想法适得其反吗?将再次创建新的文本,使 GC 无效。 (假设池中仅存在一组特定的文本,它们永远不会过时,迟早会再次需要它们)
我最近了解了Java字符串池,有几件事我不太明白。 使用赋值操作符时,如果字符串池中不存在新字符串,则将在字符串池中创建新字符串。 当使用String构造函数时,我明白无论String池的状态如何,都将在堆中、String池之外创建一个新字符串。 我在某处读到过,即使在使用构造函数时,也在使用字符串池。它将把字符串插入到字符串池和堆中。 我没有找到任何关于这方面的进一步信息,但我想知道这是不是真的
问题内容: 以下两段代码是否相同? 问题答案: 它们具有相同的 最终结果 ,但它们并不相同(它们将产生不同的字节码;版本实际上经过了这些步骤,生成了新的字符串对象,然后对其进行中间化)。 来自以下两个相关引号: 调用该方法时,如果池中已经包含与该方法确定的对象相等的字符串,则返回池中的字符串。否则,将此对象添加到池中,并返回对该对象的引用。 所有文字字符串和字符串值常量表达式都将被插入。 因此,