回收不可变字符串的第一个引用

时间:2013-05-09 17:22:10

标签: java garbage-collection immutability

我看到很多关于不可变字符串的Q& A说当我们执行以下操作时JVM实际上创建了一个新引用:

String text = "apple";
text = "orange"; // a new reference is created

我的问题是,之前的参考“苹果”发生了什么?由于Java垃圾收集是自动的,这是否意味着没有有意重新声明内存的方法?

编辑: 我问这个问题的原因是我想知道将来如何处理String变量。

字符串文字是否被GC清除?如果没有,那么游戏池会不会变得如此庞大,直到内存不足为止?考虑到程序是否从UI上的文本框接收不同的字符串值,用户输入的每个不同值将添加到池中。

3 个答案:

答案 0 :(得分:3)

即使使用System.gc(),也无法有意回收内存(这只是对JVM的建议)。

即使垃圾收集运行,“苹果”也不一定会被回收。

根据JLS 3.10.5,字符串文字被固定在字符串池中,因此永远不会被垃圾收集

引用:

字符串文字是对String类实例的引用(§4.3.1,§4.3.3)。

  

此外,字符串文字总是指同一个类的实例   字符串。

     

这是因为字符串文字 - 或者更一般地说是字符串   这是常量表达式的值(§15.28) - 是“实习”   以便使用String.intern。方法共享唯一的实例。

修改

根据this answer,即使是被拦截的字符串也可以被垃圾收集。

答案 1 :(得分:2)

不,你不能强制GC运行。重要的是要认识到"apple"字符串不会被销毁。它被声明为文字字符串,因此它将成为字符串池。

答案 2 :(得分:1)

无法显式回收完全取消引用的对象。您可以致电System.gc();,但这仅仅是执行gc的建议,而不是保证将执行gc