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集视频教程

posted @ 2019-08-08 19:19  Nullpointer_dxy  阅读(116)  评论(0编辑  收藏  举报