WeakHashMap
引用分类
强引用:StrongReference:引用指向对象,gc运行时不回收
软引用:softReference gc运行时可能回收(jvm内存不够时)
弱引用:wekaReference gc运行时立即回收
虚引用:PhantomReference类似于无引用,主要跟踪对象被回收的状态,不能单独使用,必须与引用队列referenceQueue联合使用
目的:避免对象长期驻留在内存中,解决垃圾 回收机制回收时机问题
weakHashMap:
键为弱引用,回收键后立即删除key-value对象
看一段代码
Map<String, String> map = new WeakHashMap<>();
//常量池对象不会回收
map.put("a1", "1");
map.put("a2", "2");
map.put(new String("c1"), "1");
map.put(new String("c2"), "2");
System.out.println("-------------gc回收前");
map.keySet().forEach(key -> System.out.println("map.get(" + key + ") = " + map.get(key)));
System.out.println("map长度:" + map.size());
// 通知回收
System.gc();
// //强制调用已经失去引用的对象的finalize方法
System.runFinalization();
System.out.println("----------gc回收后");
System.out.println("map长度:" + map.size());
map.keySet().forEach(key -> System.out.println("map.get(" + key + ") = " + map.get(key)));
运行结果:
可见常量池对象不会a1,a2不会被回收,而c1,c2会被回收
weakhashmap使用的场景是map中存的数据占用内存太大,希望gc回收这块内存,不知道各位都是用哪个类实现缓存的,知道的同学可以指导下
学习感受:感觉项目中一般用的缓存软引用应该比较合适
摘自尚学堂300集视频教程