当我在维基百科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)引用的字符串的强引用,对字符串池中的字符串
答案 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()