专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
芋道源码  ·  负载均衡 LVS vs Nginx ... ·  7 小时前  
芋道源码  ·  为什么有些程序员上班时总是戴着耳机? ·  昨天  
Java编程精选  ·  字节员工爆料:快40岁了,每天晚上加班到12 ... ·  2 天前  
ImportNew  ·  亚马逊程序员破防:AI ... ·  2 天前  
51好读  ›  专栏  ›  ImportNew

浅谈 WeakHashMap

ImportNew  · 公众号  · Java  · 2017-04-16 12:01

正文

请到「今天看啥」查看全文



Java WeakHashMap 到底Weak在哪里,它真的很弱吗?WeakHashMap 的适用场景是什么,使用时需要注意些什么?弱引用和强引用对Java GC有什么不同影响?本文将给出清晰而简洁的介绍。


总体介绍


在Java集合框架系列文章的最后,笔者打算介绍一个特殊的成员:WeakHashMap,从名字可以看出它是某种 Map。它的特殊之处在于 WeakHashMap 里的entry可能会被GC自动删除,即使程序员没有调用remove()或者clear()方法。


更直观的说,当使用 WeakHashMap 时,即使没有显示的添加或删除任何元素,也可能发生如下情况:


  • 调用两次size()方法返回不同的值;

  • 两次调用isEmpty()方法,第一次返回false,第二次返回true;

  • 两次调用containsKey()方法,第一次返回true,第二次返回false,尽管两次使用的是同一个key;

  • 两次调用get()方法,第一次返回一个value,第二次返回null,尽管两次使用的是同一个对象。


遇到这么奇葩的现象,你是不是觉得使用者一定会疯掉?其实不然, WeekHashMap 的这个特点特别适用于需要缓存的场景 。在缓存场景下,由于内存是有限的,不能缓存所有对象;对象缓存命中可以提高系统效率,但缓存MISS也不会造成错误,因为可以通过计算重新得到。


要明白 WeekHashMap 的工作原理,还需要引入一个概念: 弱引用(WeakReference) 。我们都知道Java中内存是通过GC自动管理的,GC会在程序运行过程中自动判断哪些对象是可以被回收的,并在合适的时机进行内存释放。GC判断某个对象是否可被回收的依据是, 是否有有效的引用指向该对象 。如果没有有效引用指向该对象(基本意味着不存在访问该对象的方式),那么该对象就是可回收的。这里的“ 有效引用 ”并不包括 弱引用 。也就是说, 虽然弱引用可以用来访问对象,但进行垃圾回收时弱引用并不会被考虑在内,仅有弱引用指向的对象仍然会被GC回收。







请到「今天看啥」查看全文