2011-06-05 92 views
3

我正在研究弱引用。而且我明白所有弱引用將在OutOfMemoryError發生之前被垃圾收集。我做了一個簡單的測試是這樣的(我知道追趕OOME並不好,但只是一個測試):弱引用沒有收集垃圾?

Integer weakInt = new Integer(10); 
WeakReference<Integer> weakReference = new WeakReference<Integer>(weakInt); 

try { 
    while (weakReference != null) { 
     String[] generateOutOfMemoryStr = new String[999999999]; 
    } 
} 
catch (OutOfMemoryError oome) { 
    System.out.println(weakReference.get()); 
} 

我預計空要打印,因爲弱引用應該被收集,但我總是得到的輸出10.

請讓我知道我要去哪裏錯了。可能我理解弱引用的概念錯了嗎?

回答

10

weakReference本身不會變爲空...它怎麼可能?但是,其目標可能會變爲空。

我懷疑你的意思是:

while (weakReference.get() != null) { 

而且,我懷疑,除非你設置weakInt本身爲null,該局部變量將防止垃圾收集Integer對象。

此外,我懷疑你會發現你的循環仍然不會結束 - 因爲你很可能要求更多內存比如果Integer是收集垃圾甚至可以分配。

這裏有一個程序,它演示了它的工作,至少在我的盒子:

import java.lang.ref.*; 

public class Test { 
    public static void main(String[] args) { 
     Integer weakInt = new Integer(10); 
     WeakReference<Integer> weakReference = new WeakReference<Integer>(weakInt); 

     weakInt = null; 
     while (weakReference.get() != null) { 
      System.out.println("Looping..."); 
      String[] generateOutOfMemoryStr = new String[999999]; 
     } 
     System.out.println("Weak reference collected"); 
    } 
} 
+0

非常感謝這個one..Just一個愚蠢的問題,可以:)後,你做weakInt爲空,我想了WeakReference .get()應該總是返回null?...但令人驚訝的是,它在執行OutOfMemoryError之前執行了幾次。 – Basith 2011-06-05 19:32:24

+0

@Basith:爲什麼它總是返回null?我們剛剛設置了一個*變量*的值爲空。我們可以將它設置爲引用一個不同的'Integer' - 這不會改變'weakReference'的目標。假設我們有'Integer x = new Integer(10)',那麼'WeakReference'離開等式。整數y = x; x =新的整數(20); System.out.println(y);' - 你期望打印什麼? – 2011-06-05 19:34:25

+0

再次感謝..明白它現在真的很好:) – Basith 2011-06-05 19:42:15