`
ahentent
  • 浏览: 2621 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

[转]WeakHashMap的神话

    博客分类:
  • Java
阅读更多
在WeakHashMap 中,当某个键不再正常使用时,将 自动 移除其条目  

可是WeakHashMap是真的自动移除其条目吗?

 

今天因为闲来无事,所以想看看WeakHashMap是如何自动实现移除其内部不用的条目从而达到的自动释放内存的目的的。仔细的看了看JVM自带 的源代码的实现,在WeakHashMap是主要通过expungeStaleEntries这个函数的来实现的。基本上只要对WeakHashMap的 内容进行访问就会调用这个函数,从而达到清除其内部不在为外部引用的条目。但是如果预先生成了WeakHashMap,而在GC以前又不曾访问该 WeakHashMap,那不是就不能释放内存了吗?

 

写个代码测试一把:


 
	public static void main(String[] args) throws Exception {

		List<WeakHashMap<byte[][], byte[][]>> maps = new ArrayList<WeakHashMap<byte[][], byte[][]>>();

		for (int i = 0; i < 1000; i++) {
			WeakHashMap<byte[][], byte[][]> d = new WeakHashMap<byte[][], byte[][]>();
			d.put(new byte[1000][1000], new byte[1000][1000]);
			maps.add(d);
			System.gc();
			System.err.println(i);


		}

	}

 

由于Java默认内存是64M,所以再不改变内存参数的情况下,该测试跑不了几步循环就内存溢出了。果不其然,WeakHashMap这个时候并没有自动帮我们释放不用的内存。

 

再加个对会对map进行访问的测试试试:


public static void main(String[] args) throws Exception {  
  
        List<WeakHashMap<byte[][], byte[][]>> maps = new ArrayList<WeakHashMap<byte[][], byte[][]>>();  
  
        for (int i = 0; i < 1000; i++) {  
            WeakHashMap<byte[][], byte[][]> d = new WeakHashMap<byte[][], byte[][]>();  
            d.put(new byte[1000][1000], new byte[1000][1000]);  
            maps.add(d);  
            System.gc();  
            System.err.println(i);  
  
            for (int j = 0; j < i; j++) {  
                System.err.println(j+  " size" + maps.get(j).size());  
            }  
        }  
    } 
 

 

这下测试就顺利通过了。

 

总结来说:WeakHashMap并不是你啥也干他就能自动释放内部不用的对象的,而是在你访问它的内容的时候释放内部不用的对象。这两句话看似区别不大,但是有时候一个小小的区别就会要了命的。

 

——————————————————华丽的分割线,以上为转载内容——————————————————————

 

另外: WeakHashMap是否自动释放看的是key是否有外部引用,如果一个key没有外部引用而其value有外部引用,照样会被gc掉。

分享到:
评论

相关推荐

    WeakHashMap的使用方法详解

    WeakHashMap的使用方法详解 WeakHashMap是Java中的一种哈希映射表,它的键是弱引用的,意味着当 WeakHashMap 的键对象只有 WeakHashMap 自己持有时,垃圾回收器可以将其回收。WeakHashMap 的使用方法主要体现在...

    java集合-WeakHashMap的使用

    WeakHashMap是Java中的一种特殊的哈希表实现,它使用弱引用(Weak Reference)来保存键对象。当键对象没有被其他强引用引用时,在垃圾回收时会自动从WeakHashMap中移除对应的键值对。

    Java编程WeakHashMap实例解析

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

    Java弱引用与WeakHashMap

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

    弱类型语言允许将一块内存看做多种类型

    - **expungeStaleEntries 方法**:为了确保 WeakHashMap 的键被正确清理,每当访问 WeakHashMap 的时候,都会调用 expungeStaleEntries 方法来清除已经无效的键值对。 #### 七、WeakHashMap 的局限性 - **访问触发...

    线程死锁CPU过高,请求原因分析

    在Java编程中,WeakHashMap是一种特殊的哈希表,它的键(Key)是弱引用,当键被垃圾回收器清除后,即使有值(Value)存在,该条目也会自动从哈希表中移除。 线程死锁的原因通常包括以下几点: 1. **资源互斥**:每...

    比较Vector、ArrayList和hashtable hashmap

    这意味着如果键不再被任何对象引用,那么即使在 WeakHashMap 中,这个键也会被垃圾收集器回收。这种方式可以防止内存泄漏,但也可能导致数据丢失。 总结: - Vector 和 ArrayList 都实现了 List 接口,其中 Vector ...

    从DELPHI到JAVA转换.docx

    而在Java中,Key/Value存储使用HashMap、TreeMap、WeakHashMap等类,例如:`HashMap,String&gt; map = new HashMap();map.put("key","value");`。需要注意的是,在Java中,Key/Value存储需要提供hashCode函数和equals...

    集合类及其分支

    WeakHashMap是一种特殊的哈希表,它使用弱引用作为键,当键不再被引用时,即使没有显式地从集合中移除,也会自动清理。 **Map接口** Map接口存储键值对,不直接继承自Collection接口。常见的Map实现有Hashtable、...

    Java 基础核心总结 +经典算法大全.rar

    Hashtable 类IdentityHashMap 类WeakHashMap 类 Collections 类集合实现类特征图 泛形 泛型的使用 用泛型表示类 用泛型表示接口泛型方法 泛型通配符 反射 Class 类Field 类Method 类ClassLoader 类 枚举 枚举特性 ...

    java集合总结.pdf

    WeakHashMap是Map接口的基于弱键的实现,以弱键实现的基于哈希表的Map。在WeakHashMap中,当某个键不再正常使用时,将自动移除其条目。 Java集合类提供了多种实现,用于解决不同的数据存储和操作问题。开发者可以...

    picketlink-jbas-common-2.6.0.CR4.zip

    【描述】"Java-WeakIdentityHashMap.zip, weakhashmap identityhashmapa独立库的组合,用于weakidentityhashmap实现内/外字段" 描述的是一个特定的Java数据结构实现,即WeakIdentityHashMap。这是一个结合了...

    java知识点整理(良心出品必属精品).pdf

    - 映射(Map):键值对存储,如HashMap、TreeMap、WeakHashMap等。 7. **多线程** - 线程创建:通过实现Runnable接口或继承Thread类创建线程。 - 线程同步:synchronized关键字实现互斥访问,wait()、notify()、...

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

    WeakHashMap是一种特殊的Map实现,它使用弱引用作为键,当键不再被引用时,即使在Map中,也会被垃圾回收器清除,从而释放内存资源。 总结来说,选择哪种容器取决于具体的需求:如果需要有序的元素集合,可以使用...

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

    - **WeakHashMap**和**IdentityHashMap**:特殊类型的Map,WeakHashMap的键使用弱引用,键在不再被引用时会被自动清理;IdentityHashMap使用对象的引用地址而非equals()方法来判断键的相等性。 4. **关联操作** -...

    2019阿里内推面经1

    而在`WeakHashMap`中,键是弱引用,当垃圾回收器回收了键所引用的对象,`WeakHashMap`会自动移除相应的键值对,从而允许垃圾回收。 最后,`IdentityHashMap`是一个特殊版本的哈希表,它使用对象的内存地址(`==`...

    java集合的介绍很全

    这意味着当没有强引用指向这些键时,垃圾回收器可以回收它们,即使它们仍然存在于`WeakHashMap`中。这使得`WeakHashMap`非常适合用于缓存场景,其中键可能不再被程序的其他部分使用。 总之,Java集合框架提供了一...

    集合框架和集合类介绍.doc

    在这里未提及,但在Java中,还有`WeakHashMap`,它属于`Map`接口的实现,其中的键(key)使用弱引用,当键不再被引用时,它可以被垃圾收集器回收。 `Map`接口表示键值对的集合,其中每个键都是唯一的。`Hashtable`...

    各种集合的总结

    总结了集合中常用的一点点,希望可以共享 List:LinkedList,ArrayList,Vector(Stack),Set Map:Hashtable,HashMap,WeakHashMap

Global site tag (gtag.js) - Google Analytics