加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

别再找了,一文彻底解析Java 中的弱引用

发布时间:2019-11-05 16:50:40 所属栏目:建站 来源:shareiOS
导读:概览 本文会通过对弱引用的界说讲起,然后通过案例的行使一步一步的深入源码举办说明其道理,从而让读者深刻的领略什么是弱引用,怎样行使弱引用,什么场景下会行使弱引用,弱引用可以办理什么样的题目,以及它的源码实现是奈何的,个中会涉及的内存溢出,
副问题[/!--empirenews.page--]

概览

本文会通过对弱引用的界说讲起,然后通过案例的行使一步一步的深入源码举办说明其道理,从而让读者深刻的领略什么是弱引用,怎样行使弱引用,什么场景下会行使弱引用,弱引用可以办理什么样的题目,以及它的源码实现是奈何的,个中会涉及的内存溢出,垃圾接纳道理

浸染:

jdk 官网表明:

  • 弱引用首要应用在不阻止它的key可能value 被接纳的mapping。直接贴英文吧,翻译程度有限(weak references are for implementing canonicalizing mappings that do not prevent their keys (or values) from being reclaimed)

小我私人领略:

  • 弱引用的呈现就是为了垃圾接纳处事的。它引用一个工具,可是并不阻止该工具被接纳。假如行使一个强引用的话,只要该引用存在,那么被引用的工具是不能被接纳的。弱引用则没有这个题目。在垃圾接纳器运行的时辰,假如一个工具的全部引用都是弱引用的话,该工具会被接纳

案例深度理会

抱负的环境下,我们但愿当我们不再行使一个工具的时辰,可以或许在gc 产生的时辰就把它接纳掉。可是有些时辰,因为我们的粗忽,在坏的环境下会导致内存溢出。这种案例尤其产生在一个生命行使周期很长的map 存放了许多现实行使生命周期短的工具。请看下面这个例子

别再找了,一文彻底理会Java 中的弱引用

别再找了,一文彻底理会Java 中的弱引用

运行后输出功效:

  1. gc 产生前:1 
  2. 开始关照GC 
  3. gc 产生后:1 

从输出的功效可以看到,纵然我们通过把key和value 配置为null 来汇报jvm,我们不再行使这个工具了,map 内里工具依然没有被GC 接纳,由于key和value 被一个强引用map 指向,按照可达性判定,垃圾接纳器是不能接纳掉key和value 这个工具的。map 被界说为statis 的静态变量,是一个行使生命周期很长的工具。在strongTest()要领中存在了一个key和value 的局部变量,它跟着要领的执行完,这个变量的生命行使周期就竣事了,可是粗拙的措施员健忘remove 了,这个时辰垃圾接纳器是不能接纳它的。假如这种生命周期相对短的工具许多,最终就有也许耗损掉JVM中所有的内存。

可是这里我有一个好奇,若是这里的key和value 指向的工具在执行完strongTest()要领 往后用不着了,可是我也许又不是很好的判定去主动挪用remove 来移除它。想要垃圾接纳器本身判定接纳掉可不行以呢?谜底着实是可以的,这个时辰就是弱引用上场了,请看下面措施

别再找了,一文彻底理会Java 中的弱引用

别再找了,一文彻底理会Java 中的弱引用

运行上面代码输出功效

  1. gc 产生前:1 
  2. 开始关照GC 
  3. gc 产生后:0 

从输出功效0,我们可以判定已经乐成被垃圾接纳了。what?整个进程我们只是把HashMap 换成了WeakHashMap,而且key 由String 换成了WeakReference。着实就是因为字符串只有弱引用指向,以是可以被垃圾接纳掉。是不是很简朴,假如到这里你就遏制研究弱引用了,那就太暴殄天物了

WeakHashMap 深度理会

上面的措施片断中,着实只有key 配置了为弱引用new WeakReference<>(key),那正常也就只有这个key 对应的内存被接纳罢了,因为没有挪用remove ,内里的value 和entry 也是不会接纳掉的,那为什么最后输出的size 是0 呢? 很好的题目,我们深入去看WeakHashMap 的源码,我们发明白一个神奇的要领expungeStaleEntries()。在看源码之前先理会下引用行列的观念: 在弱引用被接纳的时辰会把该工具放到引用行列中,也就意味着从引用行列中获取的工具都是被接纳的工具,先表明到这里,足以满意我们下面的源码说明白,接下来会做具体的理会

别再找了,一文彻底理会Java 中的弱引用

别再找了,一文彻底理会Java 中的弱引用

从上面的代码片断,或许的意思就是从引用行列内里取出被接纳的工具,然后和WeakHashMap 中的工具查找,找到之后就把对应的value 也配置为null,而且把对应的entry 配置为null,来汇报GC 去接纳它。从源码可以看到expungeStaleEntries() 这个要领在执行WeakHashMap中的任何要领的时辰城市被挪用到的

别再找了,一文彻底理会Java 中的弱引用

到这里也就完全大白为什么value 不配置为弱引用和没有显性的挪用remove 要领也可以接纳掉了

引用行列

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读