`
wzucxd
  • 浏览: 26602 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

WeakHashMap和HashMap的区别

 
阅读更多

今天在排查一个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将会保留

Java代码收藏代码
  1. packagetest;
  2. importjava.util.HashMap;
  3. importjava.util.Iterator;
  4. importjava.util.Map;
  5. importjava.util.WeakHashMap;
  6. publicclassTest{
  7. publicstaticvoidmain(String[]args)throwsException{
  8. Stringa=newString("a");
  9. Stringb=newString("b");
  10. Mapweakmap=newWeakHashMap();
  11. Mapmap=newHashMap();
  12. map.put(a,"aaa");
  13. map.put(b,"bbb");
  14. weakmap.put(a,"aaa");
  15. weakmap.put(b,"bbb");
  16. map.remove(a);
  17. a=null;
  18. b=null;
  19. System.gc();
  20. Iteratori=map.entrySet().iterator();
  21. while(i.hasNext()){
  22. Map.Entryen=(Map.Entry)i.next();
  23. System.out.println("map:"+en.getKey()+":"+en.getValue());
  24. }
  25. Iteratorj=weakmap.entrySet().iterator();
  26. while(j.hasNext()){
  27. Map.Entryen=(Map.Entry)j.next();
  28. System.out.println("weakmap:"+en.getKey()+":"+en.getValue());
  29. }
  30. }
  31. }
分享到:
评论

相关推荐

    比较Vector、ArrayList和hashtable hashmap

    和 HashMap 不同的是,Hashtable 不允许 null 键和 null 值。此外,Hashtable 的行为更接近于传统数据库的表格,它不允许空引用作为键或值,因此在某些场景下可能更严谨。 WeakHashMap 类 WeakHashMap 是 HashMap ...

    HashMap与HashTable和HashSet的区别

    ### HashMap与HashTable和HashSet的区别 #### 一、概述 在Java集合框架中,`HashMap`, `HashTable` 和 `HashSet` 是三个重要的数据结构,它们分别实现了`Map`接口和`Set`接口,提供了不同的功能来满足不同的编程...

    WeakHashMap的使用方法详解

    3. WeakHashMap 与 HashMap 的区别:WeakHashMap 的键是弱引用的,而 HashMap 的键是强引用的,意味着 HashMap 的键对象永远不会被垃圾回收器回收。 4. WeakHashMap 的应用实例:Tomcat 中的缓存机制使用了 ...

    HASHMAP缓存.txt

    在深入探讨《HASHMAP缓存.txt》所提及的知识点前,我们先来解析一下文档的标题、描述和部分内容,以确保我们对所讨论的主题有全面的理解。标题“HASHMAP缓存.txt”暗示了文档主要关注的是Java编程语言中HashMap作为...

    Java中List、ArrayList、Vector及map、HashTable、HashMap分别的区别.

    Java中的容器类是Java集合框架的重要组成部分,它们用于存储和管理数据。...在实际应用中,通常推荐使用非同步的实现,如ArrayList和HashMap,因为它们的性能更高,然后根据需要在多线程场景下添加同步机制。

    Java编程WeakHashMap实例解析

    WeakHashMap是Java编程中的一种特殊的HashMap实现,它使用弱引用来保存键和值,这样可以使得垃圾回收器自动清理键和值。在WeakHashMap中,键和值都是弱引用的,这样可以避免内存泄露的问题。 WeakHashMap的实现...

    Java 集合框架高难度进阶版面试题集锦解析

    15. IdentityHashMap 和 HashMap 的区别: - IdentityHashMap 使用对象的引用相等性而非对象的equals()方法来判断键是否相同。 - HashMap 默认使用对象的equals()和hashCode()方法来比较键。 16. Iterator 和 ...

    数据结构和Java集合框架

    Map接口则用于存储键值对,例如HashMap、TreeMap和WeakHashMap。HashMap提供快速的存取,基于哈希表实现;TreeMap则按照键的自然顺序或自定义比较器排序;WeakHashMap使用弱引用作为键,当键不再被引用时,键值对会...

    Java中HashMap和Hashtable及HashSet的区别

    在Java编程语言中,`HashMap`、`Hashtable`和`HashSet`都是集合框架的重要组成部分,分别用于存储键值对和不重复元素。下面将详细解释它们之间的区别。 首先,`Hashtable`是`Map`接口的一个早期实现,它提供了一个...

    java容器(持有对象)

    常见的Map实现有HashMap、TreeMap、Hashtable和WeakHashMap。HashMap是基于哈希表的,快速查找但无序;TreeMap基于红黑树,有序且支持按键或按键值排序;Hashtable是线程安全的老式实现,与Vector一样已较少使用;...

    Java基础总结下1

    Map接口的实现有HashMap、LinkedHashMap、TreeMap和WeakHashMap,HashMap提供快速查找,LinkedHashMap保持插入顺序,TreeMap按自然顺序或定制比较器排序,WeakHashMap则使用弱引用键。此外,Hashtable是古老的线程...

    2019阿里内推面经1

    `WeakHashMap`与`HashMap`的主要区别在于键的引用类型。在`HashMap`中,键是强引用,即使在其他地方没有引用,只要存在于`HashMap`中,对象就不会被垃圾回收。而在`WeakHashMap`中,键是弱引用,当垃圾回收器回收了...

    Java集合框架完整说明便于了解集合

    6. HashMap和HashSet的区别:HashMap关注键值对,HashSet关注元素的唯一性,两者都基于哈希表实现,但HashSet的元素是HashMap的键。 7. 多线程问题:HashMap在多线程环境下不安全,可能导致死循环,应使用...

    java中集合的用法与区别.docx

    Map接口的实现类有Hashtable、HashMap、LinkedHashMap、WeakHashMap和IdentityHashMap。Hashtable与HashMap类似,但它是线程安全的,不接受null键值。HashMap是非同步的,允许null键和null值。LinkedHashMap保持了...

    map,list,set,stack,queue,vector等区别和特点1

    在Java编程语言中,集合框架是处理对象组织和操作的...在多线程环境中,线程安全的实现如Vector和Hashtable是必要的,但在单线程或性能要求较高的情况下,非线程安全的实现如ArrayList、LinkedList和HashMap通常更优。

    Java弱引用与WeakHashMap

    书中还提到可以用WeakHashMap来作为缓存的容器可以有效解决这一问题。之前也确实遇到过类似问题,但是没有接触过“弱引用”相关的问题,于是查阅了一些资料。  《Java 理论与实践: 用弱引用堵住内存泄漏》一文也...

    多年的开发经验,与大家共享

    首先,让我们讨论`Hashtable`和`HashMap`的区别。`Hashtable`是`Dictionary`的子类,它是一个线程安全的容器,其方法默认是同步的。这意味着在多线程环境中,你可以直接使用`Hashtable`而不用担心数据同步问题。相反...

    1216集合类的说明与区别

    常见的Map实现类有Hashtable、HashMap和WeakHashMap。Hashtable与Vector类似,是线程安全的,但不推荐在现代Java中使用,因为它不允许null键和值。HashMap是非同步的,提供快速的查找,插入和删除操作,键和值都可以...

    set,list,map区别与联系.docx

    【标题】:集合框架中的set、list和map区别与联系 在Java编程中,集合框架是数据结构的核心,其中set、list和map是最常见的三种数据结构。这些数据结构各有特点,适应不同的应用场景。 1. **List(列表)** - **...

Global site tag (gtag.js) - Google Analytics