1

我看到很多关于 Immutable String 的问答说当我们执行以下操作时 JVM 实际上会创建一个新引用:

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

我的问题是,以前的参考“苹果”会发生什么?既然Java Garbage Collection 是自动的,那是否意味着没有有意的方式来回收内存呢?

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

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

4

3 回答 3

3

即使有System.gc()(这只是对 JVM 的一个建议),也没有办法故意回收内存。

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

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

报价:

字符串文字是对 String 类实例的引用(第 4.3.1 节、第 4.3.3 节)。

此外,字符串字面量总是引用 String 类的同一个实例。

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

编辑

根据这个答案,即使是实习字符串也可以被垃圾收集。

于 2013-05-09T17:28:18.947 回答
2

不,您不能强制 GC 运行。重要的是要意识到"apple"String 不会被破坏。它被声明为文字字符串,因此它将进入字符串池。

于 2013-05-09T17:27:02.533 回答
1

没有办法显式回收完全取消引用的对象。您可以致电System.gc();,但这只是执行 gc 的建议,并不保证会执行 gc

于 2013-05-09T17:25:22.837 回答