如何在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何时进入字符串池的更多详细信息。
是的案例
- new String()总是创建新的Object。 它没有实习,所以你不能从记忆中取回它。
没有案例
- 字符串a =“aa”; 如果已经可用它从池中检索,当它不可用时,它会创建一个也被实习的新对象。
- new String()。intern()或“aa”.intern(); 如果已经可用它从池中检索,当它不可用时,它会创建一个也被实习的新对象。
- 连接(“a”+“b”)