00:00
那讲完了前面我们说这几个基本概念之后啊,咱们接下来呢,来讲这个六七八九十,诶六七八九十呢,我们讲的呢,全都是引用,OK,那咱们就来看一看,这里边儿主要涉及到的这个问题是哪些,首先的话呢,我们来看这样的一个诉求。啊,这样一个诉求呀,我们希望呢,描述这样的一类对象说呀,当内存空间还足够的时候,那我们呢,就把它们保留在这个内存空间当中,那如何成内存空间不够呢?那我们就进行垃圾回收了,对吧,那垃圾回收之后呢,内存还是比较紧张,那这个时候呢,我们就抛弃这些对象。嗯,大家你注意哈,咱们现在这个描述是不是跟咱们前面讲的那个,呃,对象的回收是不是还是不太一样的,对吧?你看我们说内存空间你要是这个够的话呢,诶都还放这儿,呃,咱们前面讲的那些引用呢,也是这样子的,关键就是你内存空间不够,就有可能要报OM了,那我们说呢,前面咱们讲的那用呢,其实还是不抛弃的,那你该报OM你就报你你你要是内存够,那你就别报是吧,咱们前面是这样子的,说现在的话呢,就是说如果你要内存紧张呢,那咱们呢,就诶把这些对象呢,给它回收掉啊,这叫一个抛弃啊,就回收的意思,这个呢,在咱们前面呢讲解当中啊,是没有涉及到过这样的情况的。
01:14
那么我们要想能够实现这样的一个诉求,那就需要呢,讲解咱们下边说的这样的几种不同的引用了,啊是这样一个情况,那那下面上面的描述的这个情况呢,实际上呢,就适合于咱们强调的,比如说那个叫缓存对吧,那缓存这个数据的话呢,你内存空间够,那我就放着缓存,你下次呢,直接使用的话呢,不用再从硬盘中去读数据了,比较快,对吧,但是你要说你内存空间不够呢,不够呢,你就把缓存给它删掉,那就类似于我们这样的一个场景。OK行,那下边的话呢,我们呃涉及到一个说呃既偏门又非常高频的一道面试题,那这道面试题呢,就专门来讲解我们这个问题的啊,说强引用软引用,弱用续用分别有什么区别,具体使用场景是什么,你看这里边我用了两个词,一个呢叫既偏门又非常高频。
02:01
看似的话呢,好像说这两个词矛矛盾对吧,但实际上呢,它又不矛盾这个偏门啊,是从咱们实际生产环境的这个场景上来讲的,诶也就是在咱们实际开发这个场景当中啊,咱们实际上很少在代码中涉及到这么多种丰富的这个引用啊,基本上咱们99%的场景呢,都是用的叫强引用,后边这几个呢,我们很少用,即使说呢,咱们使用的一些类库,包括一些框架的底层源码当中,诶,用到了这个相关的软引用或者弱引用。啊,乃至于说这个续用,但是我们直接使用的机会呢,还是比较少的,对吧,所以这个呢,诶从这个使用频率上来讲呢,它是属于偏门的,但是呢,我们说这个高频怎么来理解呢?诶因为毕竟呢,这算是一个综合性的一个题目,来通过这个题目的话呢,能够考察你对这个基础概念的一个理解,以及呢,考察诶你对于底层对象的一个生命周期啊,包括垃圾回收机制啊,一个理解是不是到位啊,所以这个题目呢,也有一定的难度,那就比较适合呢来做一个面试题。
03:02
啊,是这样一个原因,好,那我们下边看一下这个介绍啊。说呢,在这个JDK1.2之后啊,咱们Java呢,对引用的这个概念呢,进行了扩充,诶对引用的概念进行扩充是从1.2版本开始的,那分出来了叫做strong reference啊soft reference weak reference和啊phantom reference这样的四种,这四种呢,就是我们称为呢叫强软弱虚说这四种,它引用的这个强度啊,叫依次减弱,那何为强度呢?哎,咱们接下来呢,一点点给大家展开,那么说到这四种引用以后呢,大家你把这个词啊多念几遍最好呢,念熟了就是强软弱虚,强软弱虚,强软弱虚,记住它啊,因为呢,我们说这个强度的话是依次递减的啊,你别给它整混了。啊,别整混了,OK,那么这四种引用,这四种引用的话呢,其中呢,主要呢,我们涉及到这个叫软引用,弱引用和这个续引用,它们三个啊,可以有三个具体的这个类啊,这三个具体类的话呢,我们都共同的继承了一个共同的父类,叫做reference。
04:02
那这个reference呢,你看这块是一个abstract是吧?嗯,就是一个抽象的。啊,Obstract是个抽象的,然后呢,诶他们呢,分别集成了共同的一个类,那那么这个类呢,是在我们Java点这个浪包点啊rap啊这样的一个子包下的,哎,我们这块呢,也可以,是不是来找一找看一看是吧?哎,我把这个呢都先关一下啊ctrl shift t,我们在这里边你就可以去搜一下啊叫做reference。诶找一下我们这个all places行,哎,这个reference的话呢,它是存在于咱们刚才看到这个Java点浪猫点还rap这样的一个包下啊,有这样的一个类啊,这个类呢,你看是个抽象类对吧?然后呢,我们点上这个F4,在这呢就能看到这个类呢,它具体的这些子类,那这个子类当中第一个叫phantom reference,这呢叫虚引用,这呢叫终结器引用,这个呢叫软引用,这个呢叫诶。这个弱引用对吧?啊,这个中间去引用的话呢,就涉及到我们这个关于发热类方法的事儿啊,这个咱们到最后呢去解释,哎,目前呢,咱们主要关注的就是剩下的这三个,以及呢,我们要说的这个叫强引用。
05:06
啊,以及我们要说的这个调应用啊,那这几个类当中啊,我们会发现呢,这是个抽象类,下边这个这些类呢,就都不是抽象的了,那下边这一类当中,你看我们主要要讲的这个叫续用,它是一个public的啊,这个软引用的也是public,这个呢也是public,也就是呢,我们在这个程序的任何一个位置是不是都可以使用啊。哎,是没有问题的啊,然后关于我们这个final啊,就是这个叫终结句啊,它是一个bone见的,哎,它呢稍微特别一点,OK,行,那这呢,就我们先熟悉一下咱们要讲的后边的这三个。哎,后边这三个呢,就对应的是我们这个reference的,它的具体的几个子类啊是这样的,那那接着呢,我们往下来看。具体的或者我们先概述性的说明一下,强软弱虚是什么意思啊,大家呢,先来看一下我的这个描述啊,这里边儿呢,我们先说的这个叫强引用,这个强引用啊,虽然说这个词呢,大家有可能没听过,但是呢,大家实际上是最不陌生的,哎,实际上是最不陌生的,怎么讲啊,咱们前面呢,说造对象的时候,是不是都是这样子写啊。
06:08
我new一个对象,然后把它付给某个引用,像这种方式,咱们声明的引用,以及它对应的这个对象的话,我们就称为叫强引用。我们就称为叫强应用,在咱们实际开发当中,99%的场景,其实我们都是用的叫强引用,只是呢,以前呢,我们没有把这个词呢,给他明确出来而已。啊说无论在任何情况下,这个强云的特点是什么呢?只要强引用的关系还存在,垃圾回收器就永远不会回收掉被赢的对象。大家能理解我这里边想要强调的这个意思吗?就是我们这个抢饮用,就咱们前面讲的哈,我现在要进行垃圾回收了,那你这个时候呢,如果是一个不可达的,那我们就回收掉,你如果你是一个可达的,因为我们这里边儿所谓的这个关系还存在,那我们垃圾回收器就一定不能够回收这样的对象。哪怕呢,你是不是出现这个oom,你也不能把我们这个枪引用在引用关系存在的情况下呢,给大家强行的垃圾回收掉啊。
07:07
对吧,所以呢,我们如果用一个词来介绍这个强应用的话呢,我们就称为呢叫不回收。或者你再强调一下,叫死也不会收是吧?哎,这个死呢,主要就是你OM啊,你OM老婆也不会收。啊,这叫强引用,那什么叫软引用呢?啊soft reference说系统啊,将要发生内存溢出之前,那将要呢,将会呢,把这些对象放入到这个回收范围之内,进行一个二次回收。就是说我们现在这个内存啊不够了,哎,马上要这个内存溢出了,那这个时候呢,咱们诶可以把这个所谓你程序当中有的这个软引用,即使呢,这时候你这个软引用这种关系啊还存在着,但是呢,我们垃圾回收器呢,也会选择把你进行一个回收。啊,也会帮你进行回收,那如果回收完以后呢,你还这个内存不够,那时候你再报这个内存溢出。啊,再报这个内存溢出,哎,说白了就是我们这个软用呢,如果我们要用一个词来概括呢,那就是说内存不足及回收。
08:03
啊,内存不足我们就回收,那内存要够呢,内存要够的话呢,这个就不回收,对吧?哎,就是这样的行,那么相较于这个软饮用呢,再强度弱一点呢,我们称为呢,叫weak reference啊弱引用。啊,那若引用跟它的区别呢?你看被弱引用这个关联的这个对象只有在呃,只有只能生存到这个下一次垃圾回收之前,那说白了就是我只要垃圾收集你这个弱营啊,是不是就得挂了。对吧,也就是说呢,只要我们垃圾收集器工作的时候呢,不管你内存够也好,还是不够也好,这个弱引用是不是都要被回收掉啊。诶大家注意啊,咱们现在所指的这些呢,都是说你这个引用关系还在的情况哈,你如果引用关系都不在了,不在的话,那块还那还说啥了,那直接就就回收了是吧,哪怕你是强引用的话呢,你引用关系都不在了,那也回收啊,那更何况是下边这些了,咱们现在谈的呢,都是说你这种引用关系还在啊,在引用关系还在的情况下呢,内存不够了,内存不够了那我们就回收你,你要内存够我就不回收。
09:04
对吧,那弱引用呢,就是我管你够不够,反正呢,只要是我垃圾回收,你呢,这个弱引用就一定会被回收。啊,也就是说我们这个论语呢,概括一个意思就是说发现及回收。我只要发现你这个弱引用了,那我只要这些我就把你回收掉。哎,这是它的一个场景,OK,然后下边这个呢,叫做虚引用啊,叫phantom reference,说一个对象啊,是否有虚引用的存在,完全不会对其生存时间构成影响,哎,这就说我们这个对象的一个生命周期啊,那也无法呢,通过这个序用呢,咱们获得一个对象的实例啊,这个咱们讲到这块具体的时候呢,哎,咱一举例子大家就知道了。关键呢,就是我们关注一下这个续用,咱们设置它的一个目的是什么是吧,说为一个对象,咱们设置续用关联的一个唯一目的啊,就是这块写的。我们设置这个训营的目的是什么呢?唯一目的啊,就是希望能够在这个对象被诶收集器回收之前啊,收到一个系统的通知。哎,收到一个系统通知,所以呢,我们通常呢,诶使用这个虚用,如果你要用的话呢,我们就是用来进行这个对象回收的一个跟踪的。
10:07
啊,对象回收的一个跟踪,OK,那那这块呢,咱们先概述性的呢,把这四种引用呢,给大家呢做了一个介绍,那大家面试的时候呢,其实诶说这四种有什么区别,那我刚才呢,其实已经讲到这个区别了,那你说他要这个应用场景的话呢,刚才也说到了99%呢,咱们其实用的都是强引用,对吧?呃,这个呢,没啥多,没啥多说了,那就是大部分场景我们用的都是强应用,那么软用跟弱用呢,就是我们强调的那个在缓存的场景下呢,我们会去用,那这个虚勇呢,主要咱们用来进行那个对象的回收的一个跟踪是吧?诶然后呢,在对象呢,被收集器回收之前呢,收到一个系统通知,诶也就这样一个情况。啊,其实也可以做一个简版的我们这道面试题的一个答案,那如果说呢,更详细的这个信息啊,哎,咱们下边呢,依次给大家展开来讲解。
我来说两句