2013-11-21 42 views
5

我有一個關於弱引用碰到過這樣的例子,從維基百科:的WeakReference到字符串,字符串常量

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。得到()。有人能讓我知道原因嗎?

非常感謝。

回答

7

字面"I'm here"是一個編譯時間常量字符串,因此被放置在常量字符串池中,直到Java 7才被收集。這意味着sr指向永遠不會被垃圾收集的對象。另一方面, r指向該字符串的副本,該副本不在任何常量池中,因此有資格收集。

看到documentation for String.intern()了一些細節上的這串池

0

如果此引用對象已經清除,或者由程序或垃圾回收器,則此方法返回null。

very well explained here