java - 字符串对象及其文字是否被垃圾收集?

标签 java string garbage-collection string-pool

我有一些关于字符串对象和文字以及字符串池的垃圾收集的问题。

设置

查看代码片段,例如:

// (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/

相关文章:

java - 将一个类从一个jsp页面导入到另一个jsp页面

string - 在 AWK 中,如何拆分与 "record"具有相同字符串的连续行?

c# - 如何在没有任何条件语句或运算符的情况下编写条件语句?

java - 具有大量引用字段(数组除外)的对象是否会破坏 Hotspot JVM 的 GC(s) 堆遍历性能?

Java gc 不会自动清理内存

java - 在 Android Activity 之间传递 PHP session

java - Getter方法使用

java - 编写可变数量的 ListenableFuture

python - 空值如何与python中的数组值匹配

memory - JavaFX 和监听器内存泄漏