如何在java中垃圾收集String对象?

正如我们所知,我们何时创建String对象,如String value = new String("ABC"); 然后将创建新的String对象,当我们再次使用value变量作为value="xyz"将创建一个新的String对象。

所以我的问题是,之前创建的String对象将在哪一点被垃圾收集?

无论何时在JAVA中调用new ,它都会在堆中创建一个对象,但是在String 文字的情况下,它将进入String Constant Pool

示例代码:

 String value = new String("ABC"); value = "xyz"; 

现在在上面的示例代码“ABC”和“xyz”中,字符串文字将转到字符串常量池,并且不会被垃圾收集,但最终value指的是字符串常量池中的“xyz”。

所以基本上有3个对象,String Constant Pool中有2个,堆中有1个。

此时先前创建的String对象将被垃圾收集?

对象是由new创建的,一旦它的范围/生命完成就会被垃圾收集,或者没有引用来访问它。 它同样适用于包括String在内的所有对象。

由于value引用将指向下一行中字符串常量轮询中值为“xyz”的现有对象,因此以前使用堆中的new创建的对象可用于垃圾收集但不符合“ABC”字符串文字仍然在字符串常量池中。


尝试将其可视化。

在此处输入图像描述

阅读更多…

就像其他Objects for String一样,JVM遵循相同的方法,一旦应用程序失去其引用,它就有资格进行垃圾回收。

对于你的情况,新的String(“ABC”)没有被实现,所以它不会进入String池,当你再次为“ABC”创建String时,会在堆中创建一个新的Object。

 String value = new String("ABC"); value = new String("ABC"); 

在上面的例子中,在执行两个行之后,第一个对象有资格进行垃

由value =“xyz”创建的字符串也被实现,因此它将在String池中创建,当你使用value =“xyz”创建String时,前一个对象从String池返回。

 String value ="xyz"; value ="xyz"; 

在上面的示例中,在执行两行之后,只创建了一个我们引用的Object,因此它不符合垃圾回收的条件。


有关String何时进入字符串池的更多详细信息。

是的案例

  1. new String()总是创建新的Object。 它没有实习,所以你不能从记忆中取回它。

没有案例

  1. 字符串a =“aa”; 如果已经可用它从池中检索,当它不可用时,它会创建一个也被实习的新对象。
    1. new String()。intern()或“aa”.intern(); 如果已经可用它从池中检索,当它不可用时,它会创建一个也被实习的新对象。
    2. 连接(“a”+“b”)