WeakHashMap HashMap的区别
来源:互联网 发布:java excel报表 编辑:程序博客网 时间:2024/05/21 08:39
今天在排查一个java heap溢出问题的时候,发现HashMap对象占用很多一直无法释放。
应用背景:读取一个大文件,每次读取处理10m数据,将数据放到HashMap中。
解决方式:尝试调用了map.clear();map=null;还告知System.gc()需要进行内存回收都没有办法,运行一段时间后heap中有大量HashMap对象无法回收。于是分析了下HashMap和WeakHashMap。采用WeakHashMap就可以了或者遍历hashmap把值都置为null。
WeakHashMap,此种Map的特点是,当除了自身有对key的引用外,此key没有其他引用那么此map会自动丢弃此值,
见实例:此例子中声明了两个Map对象,一个是HashMap,一个是WeakHashMap,同时向两个map中放入a、b两个对象,当HashMap remove掉a 并且将a、b都指向null时,WeakHashMap中的a将自动被回收掉。出现这个状况的原因是,对于a对象而言,当HashMap remove掉并且将a指向null后,除了WeakHashMap中还保存a外已经没有指向a的指针了,所以WeakHashMap会自动舍弃掉a,而对于b对象虽然指向了null,但HashMap中还有指向b的指针,所以
WeakHashMap将会保留。
package test; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.WeakHashMap; public class Test { public static void main(String[] args) throws Exception { String a = new String("a"); String b = new String("b"); Map weakmap = new WeakHashMap(); Map map = new HashMap(); map.put(a, "aaa"); map.put(b, "bbb"); weakmap.put(a, "aaa"); weakmap.put(b, "bbb"); map.remove(a); a=null; b=null; System.gc(); Iterator i = map.entrySet().iterator(); while (i.hasNext()) { Map.Entry en = (Map.Entry)i.next(); System.out.println("map:"+en.getKey()+":"+en.getValue()); } Iterator j = weakmap.entrySet().iterator(); while (j.hasNext()) { Map.Entry en = (Map.Entry)j.next(); System.out.println("weakmap:"+en.getKey()+":"+en.getValue()); } } }
0 0
- WeakHashMap HashMap的区别
- WeakHashMap和HashMap的区别
- WeakHashMap和HashMap的区别
- WeakHashMap和HashMap的区别
- WeakHashMap和HashMap的区别
- WeakHashMap和HashMap的区别
- WeakHashMap和HashMap的区别
- WeakHashMap和HashMap的区别
- 解析WeakHashMap与HashMap的区别详解
- Java中HashTable、HashMap、WeakHashMap的区别及用法小结
- hashmap,hashtable,TreeMap, WeakHashMap的区别和联系?
- HashMap,HashTable,TreeMap,WeakHashMap有哪些区别?
- HashMap、weakHashMap、LinkedHashMap和TreeMap四者区别与联系
- HashMap VS WeakHashMap
- HashMap、HashTable、TreeMap和WeakHashMap
- java容器--Map{Hashtable,HashMap,WeakHashMap}
- HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)
- Java中Hashtable,HashMap,WeakHashMap遍历方法
- Python实现fibnacci
- 收获总结一
- 黑马程序员——一个最基本的小程序以及自己对Java的认识
- UVa 1589 - Xiangqi
- UVALive 6531 Go up the ultras 单调栈+RMQ
- WeakHashMap HashMap的区别
- 解析atlas文件
- 为何Redis要比Memcached好用
- UVa 1585 - Score
- Linux - tmux 多屏复用工具
- OpenWrt arp 命令问题
- 几句废话
- 黑马程序员——面向对象入门总结
- IOS_UIWebView字体大小、字体颜色、背景色