WeakHashMap垃圾回收原理

作者: 涤生YQ | 来源:发表于2017-11-25 15:19 被阅读336次

WeakHashMap垃圾回收原理

简书 涤生
转载请注明原创出处,谢谢!
如果读完觉得有收获的话,欢迎点赞加关注。

介绍

WeakHashMap自然联想到的是HashMap。确实,WeakHashMap与HashMap一样是个散列表,存储内容也是键值对。与HashMap类似的功能就不展开了,本文重点关注在WeakHashMap是如何做到回收数据?

垃圾回收原理

谈WeakHashMap回收原理得从WeakReference(弱引用)说起。大家都知道GC回收对象前提是,从根集出发的引用中没有有效引用指向该对象,则该对象就可以被回收,这里的有效引用并不包含WeakReference,虽然弱引用可以用来访问对象,但进行垃圾回收时弱引用并不会被考虑在内,仅有弱引用指向的对象仍然会被GC回收。
那WeakHashMap是如何跟WeakReference关联起来的呢?
我们一起看看实现的code吧。


WeakHashMap Entry

大家都知道HashMap实现里面有个Entry数组,WeakHashMap也一样也有一个Entry数组,但是此Entry与彼Entry有些不一样。WeakHashMap的Entry是继承WeakReference,这样一来,整个Entry就是一个WeakReference,再来看看Entry的构造方法,调用了super(key, queue),也就是调用了这个构造方法


WeakReference

有两个参数,一个key,一个是queue,这个key就是WeakHashMap中存储的key值,这个queue是WeakHashMap中创建的ReferenceQueue。


WeakHashMap ReferenceQueue

那这个ReferenceQueue是干嘛的呢?了解GC的朋友可能知道,当GC某个对象时,如果有此对象上还有弱引用与其关联,会将WeakReference对象与Reference类的pending引用关联起来,然后由Reference Handler线程将该插入ReferenceQueue队列。
也就是说当Entry中的key被GC时,会将Entry放入到ReferenceQueue中,WeakHashMap就能个通过ReferenceQueue中的Entry了解到哪些key已经被GC,或者即将马上被GC,起到了通知的作用。

了解了以上信息后,我们再看下面这段代码:


WeakHashMap expungeStaleEntries

这段代码就是WeakHashMap用来处理ReferenceQueue中被GC的key所关联的Entry相关数据,通过从queue中poll出相关的Entry,然后去WeakHashMap的entry数组中找到索引,然后从对应的链中去掉相关的Entry,最后将value赋值为空(Help GC),到这里就完成了相关数据的清理。
但是谁来触发expungeStaleEntries方法呢?有多个方法都可以触发,如put、get、remove、size等方法都能够触发相关的逻辑。

误区

是不是使用了WeakHashMap就一定没有问题了呢?当然不是,如果没有触发expungeStaleEntries这个方法依然会导致内存泄漏,比如初始化好WeakHashMap中相关数据后,一直不调用put、get、remove、size等相关方法,也是不能够正常回收的。

总结

了解了WeakHashMap原理之后,使用起来是不是更加得心应手了呢。

欢迎关注微信公共号

相关文章

  • Java开发大型互联网-探索WeakHashMap垃圾回收原理你

    WeakHashMap垃圾回收原理 垃圾回收原理 谈WeakHashMap回收原理得从WeakReference(...

  • WeakHashMap垃圾回收原理

    WeakHashMap垃圾回收原理 简书 涤生。转载请注明原创出处,谢谢!如果读完觉得有收获的话,欢迎点赞加关...

  • Go语言——垃圾回收GC

    Go语言——垃圾回收GC 参考: Go 垃圾回收原理 Golang源码探索(三) GC的实现原理 Getting ...

  • JavaScript的垃圾回收机制

    大纲 1、认识垃圾回收机制2、垃圾回收机制的原理3、垃圾回收机制的标记策略4、垃圾回收机制与内存管理 1、认识垃圾...

  • JavaScript中的垃圾回收

    垃圾回收概述 JavaScript具有垃圾自动回收机制 原理是:找出不再使用的变量,释放其内存空间,为此垃圾回收器...

  • 垃圾回收算法原理

    垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? 对于GC来说,当...

  • JavaScript垃圾回收机制

    JavaScript具有自动垃圾回收机制,回收原理很简单:找到那些不再使用的变量,然后释放其内存空间,垃圾回收器会...

  • GC垃圾回收的原理和涉及的几种算法

    1 GC垃圾回收的原理 其实垃圾回收的原理很简单:就是判断出死亡的对象,然后清除死亡的,留下存活的即可。那么怎么判...

  • 高级PHP面试题

    # PHP 篇 ## GC PHP 5 的内存回收原理?请详细描述ZendMM的工作原理 PHP 7 的垃圾回收和...

  • 请简述 JVM 垃圾回收原理

    请简述 JVM 垃圾回收原理答:一、定义:垃圾回收是对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,目...

网友评论

    本文标题:WeakHashMap垃圾回收原理

    本文链接:https://www.haomeiwen.com/subject/oyabvxtx.html