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

时间:2014-07-12 08:22:27

标签: java string garbage-collection

我们知道什么时候创建像String value = new String("ABC");这样的String对象 然后将创建新的String对象,当我们再次使用值变量value="xyz"时,将创建一个新的String对象。

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

2 个答案:

答案 0 :(得分:7)

每当你在JAVA中调用new时它会在堆中创建一个对象,但是在String literals 的情况下,它将进入字符串常量池。 / p>

示例代码:

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

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

所以基本上有3个对象,字符串常量池中有2个,堆中有1个。

  

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

new创建的对象在其范围/生命完成后将被垃圾收集,或者没有对其进行访问的参考。它同样适用于所有对象,包括String。

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


尝试将其可视化。

enter image description here

Read more...

答案 1 :(得分:2)

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

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

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

在上面的示例中,在执行两个行之后,第一个对象符合垃圾回收的条件。

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

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

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


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

是案例

  1. new String()始终创建新的Object。这不是你的实习 不能从记忆中取回来。
  2. 无案例

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