我們知道弱引用的特點:無論是否JVM內存是否足夠,只要垃圾回收機制執行,都會回收該對象佔用的內存
執行如下代碼,猜想結果
public static void main(String[] args) {
WeakHashMap<String,Object> wmap = new WeakHashMap<String,Object>();
wmap.put("k1", "v1");
wmap.put(new String("k2"), "v2");
String key=new String("k3");
String value="v3";
wmap.put(key, value);
//key=null;
System.out.println(wmap);
System.gc();
System.out.println(wmap);
}
執行結果:
執行GC之後,只有k2那對數據被回收了,而k1、k3都還在。
通過觀察,k1和k2不同的是k1的key是"k1"寫法,k2的key是new String("k2")寫法,針對這兩種不同的寫法導致不同的GC結果,看了一些網友的觀點,比價認同的是:k1的key是在字符串常量池中,k2的key是創建在堆內存中
k2和k3不同的是k3是先聲明瞭一個key指向它,這個網上沒找到,通過JDK的API:
Hash table based implementation of the Map interface, with weak keys. An entry in a WeakHashMap will automatically be removed when its key is no longer in ordinary use. More precisely, the presence of a mapping for a given key will not prevent the key from being discarded by the garbage collector, that is, made finalizable, finalized, and then reclaimed. When a key has been discarded its entry is effectively removed from the map, so this class behaves somewhat differently from other Map implementations.(基於哈希表的Map接口的實現,帶有弱鍵。 如果WeakHashMap中的條目不再是普通使用的鍵,它將自動被刪除。 更確切地說,給定鍵的映射的存在不會阻止該鍵被垃圾收集器丟棄,即被終結化,終結和回收。 丟棄鍵後,其條目會從映射中有效刪除,因此此類的行爲與其他Map實現有所不同。Google翻譯)
個人認爲是k3的key被一個聲明的key指針關聯,即變成了強引用,導致未被GC掉
驗證猜想,將key在GC前置爲null,再次執行
k3被成功回收