内存中带有文字字符串的 StringBuilder / StringBuffer

StringBuilder / StringBuffer with literal string in memory

示例代码:

StringBuffer sb = new StringBuffer("hi");
sb = null;

问题:

文字字符串 "hi" 是否会以某种方式保留在内存中,即使在 StringBuffer 已被垃圾回收之后?或者它只是用来为 StringBuffer 创建一个 char 数组,然后永远不会放在内存中的任何地方?

是的,hi 是一个编译时常量,因此它会被编译器驻留并驻留在字符串池中。

此外,G1GC 可以执行字符串重复数据删除作为 JEP 192: String Deduplication in G1 的一部分,在这种情况下,即使 hi 没有被 javac 保留,它也可能作为重复数据删除的一部分保留。

A string literal always refers to the same instance of class String. This is because string literals - or, more generally, strings that are the values of constant expressions (§15.28) - are "interned" so as to share unique instances, using the method String.intern.

JLS 11 > 3. Lexical Structure > 3.10.5. String Literals