在单机版系统中需要实现一个简单的缓存功能(不使用分布式缓存系统),在内存中用一个map来实现就行了,通常的map可用 LinkedHashMap也可以用WeakHashMap 来实现,他们的区别在于淘汰机制上,前者是在构建时设置一个阀值(或者是可以在回收的时候决定那个对象优先被回收),当到了一个阀值之后就会决定老的对象是否要被淘汰。而后者WeakHashMap 是基于虚拟机的垃圾回机制来淘汰的,回收时,容器中哪个对象对回收完全是由GC来决定的。
这里通过一些代码来来说明WeakHashMap的特性,首先第一个代码,可以顺利执行完成:
public void test1() throws Exception { //List<byte[][]> keys = new ArrayList<byte[][]>(); byte[][] key = null; WeakHashMap<byte[][], byte[][]> maps = new WeakHashMap<byte[][], byte[][]>(); for (int i = 0; i < 10000; i++) { key = new byte[1000][1000]; maps.put(key, new byte[1000][1000]); // System.gc(); System.err.println(i); System.err.println(" size" + maps.size()); } }
从输出结果上可以发现,size的大小,会由小变大,突然变小,然后再由小变大。这个说明垃圾回收期在器作用,这个和jdk的说明文档是一致的:
/ * An entry in a <tt>WeakHashMap</tt> will automatically be removed when * its key is no longer in ordinary use. More precisely, the presence of a * mapping for a given key will not prevent the key from being discarded by the * garbage collector, that is, made finalizable, finalized, and then reclaimed. * When a key has been discarded its entry is effectively removed from the map, * so this class behaves somewhat differently from other <tt>Map</tt> * implementations. */
当GC开始回收的时候会发现,map的key已经不被使用了,即使map中key和value的映射已然存在,也不能阻止map的key被GC回收掉。当map的key被回收了之后,value对象也会被顺利地回收的。
再看下面这个代码:
public void test2() throws Exception { List<byte[][]> keys = new ArrayList<byte[][]>(); byte[][] key = null; WeakHashMap<byte[][], byte[][]> maps = new WeakHashMap<byte[][], byte[][]>(); for (int i = 0; i < 10000; i++) { key = new byte[1000][1000]; keys.add(key); maps.put(key, new byte[1000][1000]); // System.gc(); System.err.println(i); System.err.println(" size" + maps.size()); } }
test2()执行到一半就会抛出OOM异常,这份代码和上一份代码的唯一区别就是,map的key放到一个list中,这样能保证方法体中的所有key都是被引用的,所以在启动垃圾回收的时候,weak中的key一个都不会被自动回收,所以OOM就在所难免了。
所以在使用WeakHashMap的时候,千万注意,使用完某个key如果希望对象会被自动回收,需要与map的key的所有引用关系切断。
相关推荐
主要介绍了WeakHashMap的使用方法详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
WeakHashMap是Java中的一种特殊的哈希表实现,它使用弱引用(Weak Reference)来保存键对象。当键对象没有被其他强引用引用时,在垃圾回收时会自动从WeakHashMap中移除对应的键值对。
本篇文章是对WeakHashMap与HashMap的区别进行了详细的分析介绍,需要的朋友参考下
主要介绍了Java编程WeakHashMap实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
《Java 理论与实践: 用弱引用堵住内存泄漏》一文也指出了使用全局的Map作为缓存容器时发生的内存泄露问题,介绍了如何使用hprof工具来找出内存泄露,并分析了如何使用弱引用来防止内存泄露,还分析了
线程死锁 CPU过高 WeakHashMap 请求原因分析
7.6.3 WeakHashMap实现类 279 7.6.4 IdentityHashMap实现类 280 7.6.5 EnumMap实现类 281 7.7 HashSet和HashMap的性能选项 282 7.8 操作集合的工具类:Collections 283 7.8.1 排序操作 283 7.8.2 查找,替换...
15.1 用weakhashmap屏蔽内存泄漏 15.2 优化java应用大小 15.3 通过randomaccess接口优化迭代列表 15.4 合并java中的多进程与系统优化 小结 附录a together工具的使用简介 附录b j2se 5.0的新特性与性能的提升 附录c ...
关于 null 的几种处理方式大小写敏感 null 是任何引用类型的初始值 null 只是-种特殊的值使用 Null-Safe 方法null 判断 关于思维导图 Java.IO Java.lang Java.math Java.net Java 基础核心总结 V2.0 IO 传统的 ...
JNA:演示了JNA的基本用法,使用Java调用C++代码。 博客目录 Java基础 Java基础学习(1)——引用 Java基础学习(2)——注解 Java基础学习(3)——泛型 Java基础学习(4)——动态代理 《Java多线程核心技术》读书笔记 ...
并对这些接口的实现类进行详细描述,包括 LinkedList、ArrayList、Vector、Stack、Hashtable、HashMap、WeakHashMap 等,然后对一些实现类的实现方式和使用经验进行讲解,同时重点介绍 WeakHashMap。希望通过本文...
Java-WeakIdentityHashMap.zip,weakhashmap identityhashmapa独立库的组合,用于weakidantityhashmap实现内/外字段
SortedMap接口、HashMap类、Hashtable类、Properties类、Map.Entry接口、WeakHashMap类、IndentityHashMap类 集合输出: Iterator、ListIterator、foreach、废除的Enumeration Collections工具类 Comparable接口、...
总结了集合中常用的一点点,希望可以共享 List:LinkedList,ArrayList,Vector(Stack),Set Map:Hashtable,HashMap,WeakHashMap
java集合框架 3.6. LinkedHashSet类 4. Map接口 4.1. Map.Entry接口 4.2. SortedMap接口 4.3. AbstractMap抽象类 4.4. HashMap类和TreeMap类 4.4.1. HashMap类 ...4.6. WeakHashMap类 4.6. IdentityHashMap类
#弱对象池问题您是否曾经想跟踪一堆对象而不直接引用它们,以免使用弱引用干扰它们的自然生命周期? 您是否曾经尝试过在运行时扩展Java对象?解决方案WeakObjectPool :用于保存和扩展[弱引用的对象]的池( “ ...
- WeakHashMap - Hashtable - Collection 集合体系详解 - Set 接口 - AbstractSet 抽象类 - SortedSet 接口 - HashSet - LinkedHashSet - TreeSet - List 接口 - AbstractList 和 AbstractSequentialList...
WeakHashMap (done) 并发集合 ArrayBlockingQueue(done) LinkedBlockingDeque (done) LinkedBlockingQueue (done) PriorityBlockingQueue (done) ConcurrentHashMap (done) ConcurrentLinkedQueue (done) C
java lru leetcode 基础算法 快速排序: 随机枢纽元快排、三路快排、三数中值快排 归并排序: 自顶向下归并、自底向上...WeakHashMap Leetcode 刷题记录 栈实现队列、队列实现栈、猫狗队列、带有最小值的栈、LRU、数据
What’s Inside Preface 1 Java SE5 and SE6 .................. 2 Java SE6 ............................................The 4th edition...........................Changes ...........................................