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

时间:2018-12-20 21:28:29

标签: java string garbage-collection stringbuilder stringbuffer

示例代码:

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

问题:

文字字符串“ hi”是否仍会保留在内存中,即使在StringBuffer被垃圾回收之后?还是只是用来为StringBuffer创建一个char数组,然后再从不将其放置在内存中?

2 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:4)

  

字符串文字始终引用类String的相同实例。这是因为使用方法§15.28 <,可以对字符串文字(或更一般地说,是常量表达式(String.intern)的字符串)进行“插入”,以便共享唯一的实例。 / em>。

     

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