00:00
那接下来啊,咱们来谈一谈,这个叫弱饮用,这个弱饮用呢,我们说比这个软饮用呢,还要再弱一点是吧?诶强软弱虚嘛,这个弱呢,属于这个第三档,叫weak reference,它的特点呢,我们要用一句话概括的话呢,叫发现及回收,发现的话呢,就是指的我们是JC啊,只要呢,你是JC的时候呢,有若引用存在,我们要进行回收,诶就是这个意思,它呢也是用来描述叫非必须的对象。啊,因为我们说所谓的必须的对象呢,那就是用强引用来表示了啊,那被弱引用呢,所关联的对象呢,只能够生存到下一次垃圾回收啊,垃圾收集的发生为止,注意这块呢,应该说只被若引用关联的啊,这块我要是严密一点的话呢,前面应该加一个这个纸字,哎,大家应该能理解这意思吧,就是如果说我们有一个,哎就比就比如我们这块吧,我们现在有一个这个弱引用,这个弱引用呢,我们对应这个对象呢,是这个new object,但是你这块呢,还维护了一个强引用啊,这就不行了,那这个时候的话呢,我们这些肯定是不能回收的,因为你还有强引用存在,对吧。啊,就相当于你有个大哥罩着呢,啊,这个你就不怕了,那如果你这个强引用销毁以后,咱们呢,只维护了一个弱引用,那此时的话呢,诶,我们就要发现其回收。
01:10
嗯,所以说这块呢,我们加一个纸字呢,更合适一些,只被若引用关联的对象呢,只能够渗到下一次垃圾回收这个位值啊,在系统GC的时候呢,只要发现若引用了,不管呢,我们此时的对空间这个内存呢,是不是充足啊,都一定要回收我们的弱引用。诶这个意思,呃,下边也提到了,说咱们垃圾回收这个线程啊,Finalizer这个线程呢,优先级比较低,所以说的话呢,我们这个不一定很快呢就能发现这个弱引用的这个对象,所以说这个弱引用呢,也有可能会存在着较长的时间啊,也有可能会存在较长时间,那我们说弱引用呢,基于它这样的一些特点呢,我们也是可以呢,诶这个使用它呢,来在一些特定场景下呢去使用是吧?呃,先说这个事啊,这个弱硬呢,跟这个软用一样。跟软引用一样啊,说在构造这个弱引用的时候呢,咱们也可以指定一个引用队列,然后当这个弱引用的对象要被回收的时候呢,我们就把它放在这个队列当中啊reference q。
02:03
啊,前面呢,这个软引用呢,也有reference q啊,咱们这块没涉及到,下边讲这个训用的时候呢,我们提一下这个队列啊,因为在训用当中我们必须要用队列了。啊,到时候再提一下啊,因为呢,你这个弱引用对象呢,咱们说不能够,呃,可能不会马上被消除是吧,销毁,所以我们就放在这个队列当中啊,通过这队列呢,去跟踪这个对象的一个回收情况啊行,那既然我们这个弱这个引用对象呢,它这个JC之前呢,它也可能会存在一定的时间,所以呢,我们也可以使用这个弱引用呢,来进行存储这个缓存数据。哎,前面咱们讲这个软用的时候呢,提到这个缓存数据的一个存储对吧?哎这个问题,哎,像我们这个在这个移动端啊,比如说像这个手机上的话呢,咱们如果要是加载的这个图片的话,哎,其实我们就可以使用这个缓存啊,这个我们通常在安卓端呢,称为呢叫三级缓存。嗯,三级缓存是吧?哎,那这里边所谓的这个三级缓存是哪三级呢?比如说大家呢,你这块打开一个今日头条这块呢,都是这个新闻的这个图片对吧?那这个一级缓存的话呢,就是我们首先呢,从这个内存级别啊先去呢获取,那如果内存当中没有的话呢,我们是不是再从这个手机本地啊,看看是不是保存过这个图片呢来获取,那如果还没有的话呢,我们是不是再通过这个网络来获取啊。
03:16
哎,通过网络获取,这呢,就成为我们这个叫三级。啊,就有一类电影好像也叫三级是吧?呃,也是非常正规的国家规定一这个是什么样的不能看,这叫三级,实际上呢,是一个非常正规的一个词,大家呢,经常容易想歪是吧?嗯,这个三级缓存就这个意思,那么它的第一级呢,叫从内存当中去找啊,那其实就可以理解为呢,我们可以使用在Java层面呢,提供的叫弱引用,或者呢叫软引用,我们呢去把这个图片呢,在内存层面呢,进行一个缓存。那当内存不够的时候呢,我们就及时清理到啊,那如果内存要够呢,我们就这个保留缓存中的这个图片信息,那当用户呢,比如说我们划上去了,你在呢,往下滑的时候呢,我们能很快的是不是就给你显示出来呀。啊,因为我们说内存级别的这个数据呢,那我们是运算速度最快的。
04:03
啊,你要说从硬盘中,那还得需要先加载到内存,内存呢,再通过这个CPU去运算是吧?哎,才叫慢一些啊。那通过网络当然就更慢了,所以我们这个顺序呢,一定是这样子的,你不能反过来是吧,反过来那要本地跟这个内存就没没没意义了啊,因为网络中一定会有了对吧?行这呢就是我们说的这个,诶使用我们软引用和弱引用它的一个应用场景,诶它的一个应用场景,那刚才呢,我们也举这个例子了,说呢,这个弱引用呢,我们有一个类呢,叫weak reference啊通过这样的一个类,我们去用一个对象,然后把我们这个对象呢,放在这个形态位置啊,这就构成了一个叫弱引用。啊,弱饮用行,那么关于这个弱饮用跟软饮用的最大区别不同是在哪儿呢?啊,这个当然也很清楚啊,一个呢叫发现及回收,一个呢是不是叫不足啊及回收啊,那其实呢,主要这个词呢,就是通过我们这个概括呢来描述的啊,那基于我们提到这个不同,所以说咱们这个弱引用啊,它被回收的时候呢,是不是就更容易更快呀。
05:03
弱引用能理解吧,我们EGC的时候呢,是不是都不用判断直接就把它回收了,但是对于我们说的这个,诶软引用来讲。对于这个软饮用来讲呢,它是不足的时候呢,是不是才回收啊,所以说我们在回收这个软用的时候呢,要经过相应的这个算法啊,进行一个判断,看看这个内存啊到底够不够,哎,看这个内存呢到底够不够,那这样的话呢,其实在回收方面呢,是不是就没有我们这个叫诶弱引用来的快一些是吧?哎,这个大家注意啊行,那说到这儿的话呢,你看我这块我还放了一个面试题。哎,这是相当于是联想过来的一个面试题,咱们在这个并发编程的时候呢,其实用过呢,叫current哈map,诶current current哈map对吧?那么在我们这里边呢,又提到一个叫week哈希map,诶说你开发中用过week哈map呢,诶哈map吗?大家你会发现我们现在叫weak reference,诶跟我们这个week哈希map呢,它就有一定的关系了。哎,你看啊,我们ctrl shift t,咱们在这呢,去搜索一下啊week。
06:03
啊哈希map啊,找到这呢,就是我们说的这个啊week哈希map这样个类啊往上拽。嗯,说这个类呢,你用过吗?哎,那这个类呢,为什么在这儿讲呢,就是跟我们这个叫呃弱营呢是相关的。哎,如果呢,我们使用这个哈奇mapb去存储,比如说这个图片信息,诶,我们用这个微克哈奇map去存储的时候呢,我们就可以在内存不足的时候呢,及时的去回收这个数据。哎,我们这个week克哈,Mapb里边我们看到呢,它用的也是entry对吧,也是entry,但是这个entry呢,你看我们点一下,它是它内部类的一个entry,这个ENT呢,它就继承了叫weaker reference,哎这呢就找到这个关联了,对吧,那这呢就是一个诶弱引用啊使得呢,我们内存中的这个数据啊,在内存不足的时候呢,及时进行回收,是不是比你用这个哈map呢,呃就呃强一用是不是就避免了这个OM的一个出现了。哎,这个呢,就是这样的一个情况啊好,那这呢是我们说的这叫弱引用,那接下来呢,咱们再举一个例子。
07:03
啊,举这个例子呢,就相较于我们前面讲那个软语来说呢,差不太多啊,也是内部呢有一个叫user,然后呢,我们这块呢,就用了一个weak reference,我把这个对象呢就造到里边了。造到里边了,然后呢,我们接下来就赶紧呢去get一下它如果没有发生内存,呃,这个这个没有发生这个JC的时候,那我们这块呢,去get的时候呢,一定是可以获取到这个对象的。啊,这个咱们前面涉及到这个软引用的时候呢,也是如此啊,那如果呢,我们手动的去调下GC,或者说当我们这个内存呢不足的时候呢,咱们系统自动的调用GC的时候,哎,我们再去看一下能不能获取到当前这个对象呢,我们就会发现找不到了。哎,因为弱赢呢,是不是一发生JC就回收了对吧。啊,那这个执行结果呢,大家想必呢,也会非常的清楚。啊,这个呢,就不用多说了,对吧,诶这呢,就是咱们给大家演示一下,这个叫诶若饮用它的一个使用。啊,那我们就说到这儿。
我来说两句