内存中带有文字字符串的 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
.
示例代码:
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 methodString.intern
.