我正在阅读维基百科关于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=我在这里,static=我在这里
垃圾回收后:r=null,static=我在这里
sr
和r
变量都引用了字符串对象。现在r
已经被垃圾回收了,但是为什么调用垃圾回收后sr
没有被回收呢?
我只是好奇这是怎么发生的。