java - String literal 声明但不再引用是否符合 G'ed 条件?

标签 java string garbage-collection

据我所知,如果在字符串池中找到字符串,intern 方法应该从字符串池中返回字符串,否则将在字符串池中添加一个新字符串对象,并引用返回此字符串。

String s = "a";
s = "b";
String str = new String("a").intern();

在这种情况下会发生什么......是否存在两种情况

  1. 直到“a”没有被垃圾回收,并且 String str = new String("a").intern(); 执行 str 将引用这个“a”
  2. 如果“a”被 Gc'ed,那么将创建一个新对象并且 str 将引用一个新的“a”;

或者“a”永远不符合垃圾回收条件?

最佳答案

这在不同的 JVM 中是不同的。例如,

OpenJDK/Hotspot Java 6:字符串文字在 PermGen 和 AFAIK 中,仅在 Full GC 上清理(不仅仅是终身空间的主要集合)

OpenJDK/Hotspot Java 7:字符串文字在堆中,可以随时收集它们未被引用的内容,但我怀疑它们由代码中使用的 PermGen 保存。

OpenJDK/Hotspot Java 8:没有 PermGen,因此字符串应该更自由地清理,即使现在由堆中的类持有也是如此。

1) 只有一个 String 字面量,并且在没有对它的引用之前不会对其进行 GC,可能在 cde 中也可能是在 ClassLoader 卸载时,如果它曾经卸载的话。

2) 您创建的第一个 "a" 和第二个 "a" 和第三个可能都是不同的字符串,如果它们在两者之间进行了 GC .

关于java - String literal 声明但不再引用是否符合 G'ed 条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20759652/

相关文章:

java - 将字符串转换为公钥时获取公钥为空

java - 使用 Scanner 时使用 InputStream 读取

regex - 检查字符串是否有非法字符

java - 令人困惑的 Zookeeper 内存使用情况

c# - GC.Collect() 阻塞了吗?

java - 如何在 Firebase 中实时存储位置?

java - 通过 ProblemsView 中的plugin.xml 添加双击操作

Golang 中的字符串内存使用

java - Eclipse 1.7 编译器中的 "isEmpty() is undefined for the type String"?

java - 弱引用有实际用途吗?