我有一些关于字符串对象和文字以及字符串池的垃圾收集的问题。
设置
查看代码片段,例如:
// (I am using this constructor on purpose)
String text = new String("hello");
我们创建两个字符串对象:
"hello"
创建一个并将其放入字符串池new String(...)
创建另一个字符串,存储在堆上
垃圾收集
现在,如果 text
超出范围并且没有人再引用它们,它可以被垃圾收集,对吗?
但是池中的文字怎么样?如果不再被任何人引用,它也可以被垃圾收集吗?如果不是,为什么?
最佳答案
当我们通过new
运算符创建一个String时,Java编译器将创建一个新对象并将其存储在为JVM保留的堆空间中。
更具体地说,它不会位于字符串池中,字符串池是(堆)内存的专门部分。
String text = new String("hello");
一旦不再有对该对象的引用,它就有资格进行 GC。
相比之下,以下将存储在字符串池中:
String a = "hello";
当我们再次调用类似的电话线时:
String b = "hello";
将从字符串池中使用同一个对象,并且它永远没有资格进行GC。
至于原因:
To reduce the memory needed to hold all the String literals (and the interned Strings), since these literals have a good chance of being used many times over.
关于java - 字符串对象及其文字是否被垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69665389/