别再找了,一文彻底解析Java 中的弱引用
副问题[/!--empirenews.page--]
概览 本文会通过对弱引用的界说讲起,然后通过案例的行使一步一步的深入源码举办说明其道理,从而让读者深刻的领略什么是弱引用,怎样行使弱引用,什么场景下会行使弱引用,弱引用可以办理什么样的题目,以及它的源码实现是奈何的,个中会涉及的内存溢出,垃圾接纳道理 浸染: jdk 官网表明:
小我私人领略:
案例深度理会 抱负的环境下,我们但愿当我们不再行使一个工具的时辰,可以或许在gc 产生的时辰就把它接纳掉。可是有些时辰,因为我们的粗忽,在坏的环境下会导致内存溢出。这种案例尤其产生在一个生命行使周期很长的map 存放了许多现实行使生命周期短的工具。请看下面这个例子 运行后输出功效:
从输出的功效可以看到,纵然我们通过把key和value 配置为null 来汇报jvm,我们不再行使这个工具了,map 内里工具依然没有被GC 接纳,由于key和value 被一个强引用map 指向,按照可达性判定,垃圾接纳器是不能接纳掉key和value 这个工具的。map 被界说为statis 的静态变量,是一个行使生命周期很长的工具。在strongTest()要领中存在了一个key和value 的局部变量,它跟着要领的执行完,这个变量的生命行使周期就竣事了,可是粗拙的措施员健忘remove 了,这个时辰垃圾接纳器是不能接纳它的。假如这种生命周期相对短的工具许多,最终就有也许耗损掉JVM中所有的内存。 可是这里我有一个好奇,若是这里的key和value 指向的工具在执行完strongTest()要领 往后用不着了,可是我也许又不是很好的判定去主动挪用remove 来移除它。想要垃圾接纳器本身判定接纳掉可不行以呢?谜底着实是可以的,这个时辰就是弱引用上场了,请看下面措施 运行上面代码输出功效
从输出功效0,我们可以判定已经乐成被垃圾接纳了。what?整个进程我们只是把HashMap 换成了WeakHashMap,而且key 由String 换成了WeakReference。着实就是因为字符串只有弱引用指向,以是可以被垃圾接纳掉。是不是很简朴,假如到这里你就遏制研究弱引用了,那就太暴殄天物了 WeakHashMap 深度理会 上面的措施片断中,着实只有key 配置了为弱引用new WeakReference<>(key),那正常也就只有这个key 对应的内存被接纳罢了,因为没有挪用remove ,内里的value 和entry 也是不会接纳掉的,那为什么最后输出的size 是0 呢? 很好的题目,我们深入去看WeakHashMap 的源码,我们发明白一个神奇的要领expungeStaleEntries()。在看源码之前先理会下引用行列的观念: 在弱引用被接纳的时辰会把该工具放到引用行列中,也就意味着从引用行列中获取的工具都是被接纳的工具,先表明到这里,足以满意我们下面的源码说明白,接下来会做具体的理会 从上面的代码片断,或许的意思就是从引用行列内里取出被接纳的工具,然后和WeakHashMap 中的工具查找,找到之后就把对应的value 也配置为null,而且把对应的entry 配置为null,来汇报GC 去接纳它。从源码可以看到expungeStaleEntries() 这个要领在执行WeakHashMap中的任何要领的时辰城市被挪用到的 到这里也就完全大白为什么value 不配置为弱引用和没有显性的挪用remove 要领也可以接纳掉了 引用行列 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |