WeakHashMap垃圾回收问题

我们知道弱引用的特点:无论是否JVM内存是否足够,只要垃圾回收机制执行,都会回收该对象占用的内存

执行如下代码,猜想结果

public static void main(String[] args) {
		
		WeakHashMap wmap = new WeakHashMap();
		
		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,再次执行

WeakHashMap垃圾回收问题_第1张图片

k3被成功回收

 

你可能感兴趣的:(Java基础)