00:00
那接下来啊,咱们就一个一个的呢,来给大家讲解这几个引用,那首先呢,咱们来给大家讲呢,叫做强引用,那强引用的话呢,其实这个也算是最简单的啊,因为呢,咱们见到的场景也是最多的,对吧,咱们平时呢,用的这个成语当中说99%啊都是强引用,这也是呢,咱们默认的使用的一种情况。啊就是只要呢不特殊的,具体咱们创建对象的时候呢,用的这些引用呢,都是叫强引用啊,通过new的方式呢,我们造个对象对吧,然后把它呢附一个变量啊这呢就叫做强引用啊那你要看例的话呢,这个例子呢,实在是太多了啊,反正呢,咱们去你个对象的方式呢,基本上都是强啊咱这呢也见一见是吧,我这呢,以这个string buffer为例呢,我造了一个对象啊这呢信息呢叫hello商V5,嗯啊这呢就是叫强运用呗,啊那这样的话呢,其实也是对吧,我们把这个HR呢,它的这个呃引用的地址呢,附给了一个另外的一个IR1这样的一个变量,然后这个引用的话呢,它也指向了对空间中引用的这对象。相当于我们现在是不是有两个引用啊,一个叫HR,一个叫HR1啊他们俩呢,相当于都是这种叫强引用,就是咱们平时见的这个情况是吧,没啥大不了的,那我们下边说啊,说这个强引用的这个对象啊,都是可触级的。
01:08
你看什么叫可触及的,还记得吧,咱们前面呢,讲这个对象的时候呢,是不是提到过,说对象呢,是不是有三种状态吧。诶,这个我们是讲到这个回收的相关算法的时候,你看是不是还记得啊,我们讲这个时候呢,提到一个叫对象的,叫finalization这样的一个机制啊们找一下啊,这个fair这个机制里边呢,提到过说这个对象啊,它有三种状态,一个呢叫可触及的,可复活的和不可触及的,那可触及呢,其实就是我们所谓的这个可达的。那就是可达的,那不可达的话呢,我们说有可能在这个泛ize方法中呢,把自己复活,那就可复活的,那你要没复活呢,那就是不可触击的,对吧?哎,这三种状态啊,行,再复习一下。这个强引用的对象呢,我们说是可触及的,或者你说呢是可达的,那就回收器呢,永远都不会回收强引用的对象,那就好比是我们这个程序当中,比如说这两行代码,那接下来的话呢,诶,这个我们假设还没有这个操作是吧,我们下来呢,你不管手动的也好,还是我们这个,呃,GVM呢,自动的垃圾回收也好,他一定不会回收我们这个对象的。
02:07
因为呢,我们有两个啊,强引用是不是都指向了它了,即使呢,你现在的这个内存空间不足了,哎,我们这儿呢,比如说你是个数组或者是一个图片等等啊,即使呢,你内存空间不足了,那你就去报OM,你也不要呢,试图把我这两个引用呢给它断掉,把这个对象呢给回收掉,这是不对的,因为呢我们是强引用。哎,这个注意啊,这两点行,那什么时候我们才有可能会回收掉这个对象呢?那就是你对于这个普通的对象来讲呢,你没有任何的引用指向了啊,然后呢,这个或者你是复制为nu了啊,超出你的作用域了啊,这个时候呢,我们垃圾回收呢,才会选择把它进行一个回收操作,那就好比是这样,比如说我们这儿没有这个操作的情况下呢,咱们把这个。打开是吧,我现在呢,这是一个强引用,然后你现在把这个IT2呢引用呢,支成个no,那我们对空间中的这个对象呢,实体就没有任何引用指向它了,那我们在进行这个JC的时候呢,就可以把它进行一个回收,哎,只有这个时候呢才回收,这咱们前面呢,这不是常见的都是这样子的嘛,对吧?行,那么相应的呢,我们把这个软引用弱引用和续用啊,他们的对象呢,就称为呢叫软可触及啊,弱可触级和虚可触级。
03:16
那在一定条件下呢,他们实际上是都是可以被回收的。啊,只有强引用的话呢,他们是不能被GC回收对吧?诶所以说这个强引用呢,也是造成咱们Java的内存泄露的一个主要原因之一。哎,注意内存泄露,咱们是不是前面已经说过这个内存泄露的例子了。哎,再找一下,哎在这是吧,你看这个位置的话呢,我们这就是一个强引用,那因为你这个指针的存在呢,JC就没办法去回收,所以呢,它就会造成这个内存泄漏。啊,所以这句话呢,你看我们体会一下,是不是说的非常的精准,对吧。好,这呢是我们说的这个事儿,下边呢,就是这个举例子啊,举例子的话呢,咱们直接看这就行,刚才呢,其实也说过了,我们上面这两行操作当中的这个HR和HR1,它们其实都是两个强引用啊,都是两个强引用,然后接下来的话呢,大家一看,我把这个H2呢制成是个no了。
04:06
啊,从这个内存结构上来看的话呢,咱们这是一个占空间,这是这个main方法的这个战帧局部变量表里边呢,一个叫S,一个呢叫一个叫HR,一个叫HR1,我简写了在咱们这个对空间中,我们用了一个string buffer,然后呢,你这个S和这个S1呢,是不是都是指向了我们对空间中用的这个对象实体,对吧?然后接下来呢,你把这个I2呢,这块呢给制成一个no,所以说明了说明了就没有这个指针了。在没有这个指针的情况下呢,我们进行一个垃圾回收,这时候你注意我们堆空间这个对象呢,也还不能够回收掉,因为呢,咱们还有S1指向对吧?诶还有一指向,那就意味着呢,你看我这是进行一个JC,相当于是调用咱们的垃圾回收。啊,但是咱们前面又说过,说这个方法呢,不一定确保说一定能够及时的GC,所以我这块呢,有一个三秒钟的一个延迟,诶保证了咱们这个GC操作呢能够实现,然后接下来呢,我们再去打印一下这个HR1。
05:00
哎,这个跑一下,其实这个程序呢,不能再简单了是吧。我再跑一下的话呢,啊,这就这个版本的问题啊,再稍微调一下。哎,这个1.8。啊,因为呢,我在这块呢,你看用的呃,这个咱们当前这个modu啊16啊这呢都是1.8是吧,那1.8的这个编译版本,你不能在这个D版本上呢,你去运行哈,就不合适了,行,那么你看啊,我们这呢,就是把它进行一个JC啊,它没有了,但是我们这个HR1呢还在啊,此时呢,我们就去做这个运行。啊,三秒钟之后,我们呢,再去做一个打印,你会发现呢,我们还是能够打印出来这个信息的,那说明呢,我们这个对象呢,就没有回收啊,因为呢,你是抢引用啊,谁敢回收你啊。对吧,哎,这个我们也可以认为称为呢,不回收,或者叫死也不回收啊,就是你报OM也不回收。啊,换句话说,你想想,如果要是报OM之前呢,它还回收了,它已经是最强的了,它都能回收,那你想想这个我们OM是不是就不会发生了呀。对吧,哎,这是一个反正法是吧,那OM呢一定会发生,就是因为呢,这哥们儿呢,太硬了是吧,太强了啊,他就是死也不回收,所以才导致OM了啊。
06:09
行,那下边呢,关于我们这个说明说强应呢,诶,它可以直接访问这个目标对象,然后呢,指向的这个任何时候呢,只要你这个引用还在呢,我们就不回收啊,即使你报OM,它可能会导致内存泄露啊,行就没了,比较简单啊,咱们前面呢,其实讲的这些信息呢,基本上都是针对这个强应用来说的啊,这也是咱们开发当中啊,大家最常见的一种场景。OK,这就过了。
我来说两句