据我所知,如果在字符串池中找到字符串,intern 方法应该从字符串池中返回字符串,否则将在字符串池中添加一个新字符串对象
,并引用返回此字符串。
String s = "a";
s = "b";
String str = new String("a").intern();
在这种情况下会发生什么......是否存在两种情况
- 直到“a”没有被垃圾回收,并且
String str = new String("a").intern();
执行 str 将引用这个“a” - 如果“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/