WeakHashMap垃圾回收問題

我們知道弱引用的特點:無論是否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被成功回收

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章