2013-07-05 58 views
4

當我閱讀維基百科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 =我在這裏,靜態= I GC後我在這裏 : R = NULL,靜態=我在這裏

我無法理解GC後的輸出,哪裏是強引用字符串由SR(WeakReference的)所指的字符串中的字符串池

+0

@ManishDoshi如果你不能有效評論這個問題,你應該諮詢Javadoc,並可能問你自己的問題。 – EJP

+0

完全相同的問題:http://stackoverflow.com/questions/14494875/weakreference-string-didnt-garbage-collected-how –

+0

@ManishDoni你似乎不瞭解StackOverflow網站。作者是提問的人。其他人應該回答問題或提供有用或相關的意見,或者提出可能闡明問題並導致答案的問題。你的既不是。這實際上是另一個問題,可以用我指出的方式來回答。問一個可能自己不明白的人的問題也是不合邏輯的,這可能是他爲什麼要問他的問題。 – EJP

回答

0

SR我s沒有收集垃圾,因爲String內部緩存Strings。因此內部緩存仍然有一個參考,因此WeakRefence不會被垃圾收集。

靜態構造的字符串就像在sr的情況下一樣被添加到緩存中。使用新Stirng(「...」)構造的字符串對象不是。因此,最好不要使用新的String(「...」)。

+0

編號sr未被垃圾收集,因爲編譯器將文字字符串放置在常量池中。通過String類進行緩存與它無關。 – EJP

0

這裏在第一種情況下,當您使用new String("I'm here")創建字符串對象時,因此對象始終在堆上創建。因此,如果您調用System.gc();,則該對象可以直接用於垃圾回收。

在第二種情況下,您傳遞字符串作爲對象的引用。因此,此處不會創建字符串的新對象,因爲字符串會直接初始化爲對象的引用,所以它將不可用於垃圾回收。因此,字符串將留在string-pool

0

字符串池中的對象不會被垃圾回收,因爲它們不駐留在堆中。如果你想在游泳池中放置一個new String(),你可以選擇使用String#intern()