2015-08-30 43 views
0

一個WeakReference的和StrongReference我的Java API文檔閱讀一些文學上的WeakReference的Java 7,並試圖測試相同與以下GC在Java

package com.finalize; 

import java.util.HashMap; 
import java.util.Map; 
import java.util.WeakHashMap; 

public class WeakRefernceTest { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     String x = new String("x1"); 
     String y = new String("x2"); 

     Map<String, Object> mw = new WeakHashMap<>(); 
     mw.put(x, new Object()); 

     Map<String, Object> m = new HashMap<>(); 
     m.put(y, new Object()); 

     x = null; 
     y = null; 

     for(int i = 0; i < 5;++i) 
     System.gc(); 

     System.out.println(mw.size()); 
     System.out.println(m.size()); 

    } 

} 

當我多次跑了,我可以看到mw.size()被打印爲0.但是我有點困惑,因爲m.size()永遠不會打印爲0.所以基本上,我想了解在這個熱點jvm中運行的默認GC。所以當GC開始標記可到達的對象並在x和y設置爲null之後運行它時,爲什麼它會將y所引用的對象標記爲可達對象,因爲y已被設置爲null?即使根變量設置爲m,GC爲什麼會到達y指向的對象並將其聲明爲可達?

相比之下,x的生命週期變化的詳細順序是什麼?

回答

0

您正在主線程上執行主方法。主線程的堆棧上有變量m。這個變量m是對HashMap實例的引用。該HashMap實例具有對映射條目數組的引用。包含在此數組中的唯一映射條目引用了「x2」鍵和相應的對象。

所以有一個從根(主線程堆棧)到存儲在地圖中的對象的強引用鏈。這會阻止GC收集地圖中的對象。

thread stack -> m -> HashMap -> entries -> entry -> "x2" 
               -> Object 

這同樣適用於其他地圖和其他對象,除了這是一個WeakHashMap中,所以因爲地圖關鍵是弱引用,並且是唯一的參考留下了點「X1」時,GC被允許收集對「x1」的引用。一旦GC收集完畢,地圖會從其陣列中刪除相應的條目。

+0

只是一個問題,上面的鏈反映了entry-> x2而不是entry-> y-> null,這意味着可以收集「x2」並且我的問題的第二部分是詳細序列,我想了解鏈中物體到達ReferenceQueue的位置,然後會發生什麼。如果問題不明確,道歉。 – 100pipers

+0

你很困惑。僅僅因爲你將y設置爲null並不意味着hashmap中的鍵變爲null。當您將y作爲關鍵字放入地圖中時,地圖會收到參考的副本,並將其存儲在其中一個條目中。將y設置爲null會使y指向任何內容,但映射中的條目仍然引用「x2」字符串。 Java是通過價值傳遞的。 –

+0

你說得對,我想我在這裏錯過了一個觀點。您是否也可以回答關於鏈中對象(弱引用之前指向的對象)轉到ReferenceQueue以及接下來會發生什麼的問題的後半部分?謝謝,我會接受答案並關閉它。我強調這一點的原因是因爲我可能有一個鏈接問題的答案!但是,謝謝! – 100pipers

0

步進通過您的代碼

  • 您做出字符串"x2"的副本,並指定這y
  • 你添加字符串"x2"作爲重點在m
  • 當GC,m可達,所有這些都是關鍵。
  • GC後,m和它的所有密鑰都保留。