Java WeakReference到字符串和字符串常量

Java WeakReference到字符串和字符串常量,java,weak-references,Java,Weak References,我在维基百科上遇到了一个关于弱引用的例子: 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"));

我在维基百科上遇到了一个关于弱引用的例子:

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());

        }
}
我不明白在这个场景中,为什么只有r.get()返回null而没有sr.get()。有人能告诉我原因吗

非常感谢。

文本
“我在这里”
是一个编译时常量字符串,因此被放在常量字符串池中,而常量字符串池(直到java 7)从未被垃圾收集过。这意味着
sr
指向一个永远不会被垃圾收集的对象。 另一方面,
r
指向该字符串的副本,该字符串不在任何常量池中,因此符合收集条件


有关此字符串池的更多详细信息,请参阅。如果此引用对象已被程序或垃圾收集器清除,则此方法返回null