对String pool Object的弱引用

时间:2013-07-05 09:41:58

标签: java string reference garbage-collection

当我在维基百科http://en.wikipedia.org/wiki/Weak_reference

上阅读以下示例代码时
import java.lang.ref.WeakReference;


    public class ReferenceTest {
            public static void main(String[] args) throws InterruptedException {

                WeakReference r = new WeakReference(new String("I'm here"));
                WeakReference sr = new WeakReference("I'm here");
                System.out.println("before gc: r=" + r.get() + ", static=" + sr.get());
                System.gc();
                Thread.sleep(100);

                // only r.get() becomes null
                System.out.println("after gc: r=" + r.get() + ", static=" + sr.get());

            }
    } 

输出 在gc之前:r =我在这里,静态=我在这里 在gc之后:r = null,static =我在这里

我无法理解gc之后的输出,其中是对sr(WeakReference)引用的字符串的强引用,对字符串池中的字符串

3 个答案:

答案 0 :(得分:0)

sr不是垃圾收集的,因为String内部缓存了字符串。因此,内部缓存仍然具有引用,因此WeakRefence不会被垃圾回收。

静态构造的字符串就像sr一样被添加到缓存中。使用新Stirng(“...”)构造的String对象不是。因此,最好不要使用新的String(“...”)。

答案 1 :(得分:0)

在第一种情况下,当您使用new String("I'm here")创建字符串对象时,始终在堆上创建对象。之后,如果您调用System.gc();,则该对象可以直接用于垃圾回收。 / p>

在第二种情况下,你传递字符串作为对象的引用。所以在这里它不会创建String的新对象,因为字符串被直接初始化为对象的引用。因此它将不可用于垃圾收集。因为这个字符串将留在string-pool

答案 2 :(得分:0)

字符串池中的对象不会被垃圾收集,因为它们不驻留在Heap中。如果您想在池中放置new String(),则可以选择使用String#intern()