一個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的生命週期變化的詳細順序是什麼?
只是一個問題,上面的鏈反映了entry-> x2而不是entry-> y-> null,這意味着可以收集「x2」並且我的問題的第二部分是詳細序列,我想了解鏈中物體到達ReferenceQueue的位置,然後會發生什麼。如果問題不明確,道歉。 – 100pipers
你很困惑。僅僅因爲你將y設置爲null並不意味着hashmap中的鍵變爲null。當您將y作爲關鍵字放入地圖中時,地圖會收到參考的副本,並將其存儲在其中一個條目中。將y設置爲null會使y指向任何內容,但映射中的條目仍然引用「x2」字符串。 Java是通過價值傳遞的。 –
你說得對,我想我在這裏錯過了一個觀點。您是否也可以回答關於鏈中對象(弱引用之前指向的對象)轉到ReferenceQueue以及接下來會發生什麼的問題的後半部分?謝謝,我會接受答案並關閉它。我強調這一點的原因是因爲我可能有一個鏈接問題的答案!但是,謝謝! – 100pipers