00:00
下边咱们给大家举个例子,通过这个例子啊,咱们想证明一下,就是Java呢,确实没有使用,这个叫引用技术算法。他没有使用它好这个代码的话呢,咱们直接来看这个程序啊,Reference count这样一个jc OK,大家看一下这个代码我已经写好了,嗯,我们当前这个类中呢,有一个属性,这个属性呢是非静态的,就是每个对象一份,我这儿呢是五兆这样的一个大小。OK,然后呢,这是声明的另外一个属性啊,叫object行在没方法当中啊,我们造两个当前类的对象啊,那每个对象的话呢,针对于这个属性呢,就是各占用是不是五兆的这个空间啊,诶没问题,然后接下来的话呢,我们把它的另外一个属性呢,进行一个赋值,就是他们互相赋值。他们互相复制啊,这样的一个行为,那这个的话呢,用我们图示来表示,大家呢,看能不能看得懂,这呢是咱们一个呃生明的两个这个对象的引用,OB1和OB2,实际上对应的就是我们这个OB1和OB2是在方法中的,所以呢,就是放在我们扎瓦逊尼战的局部局部变量表里边的这两个引用指向了这两个对象。
01:01
这呢,咱们不是说各种各样的一个类型的,咱这块呢,是不是就造了一个,呃,一个数组对吧,给一个数组,然后其中呢,又有一个属性呢,叫做reference,这个reference呢,咱们就互相指向彼此了,哎,就是这样一个情况。哎,就是这个就是我们刚才这个代码这个图上的一个描述,然后接下来的话呢,我们把诶这个OB1和OBG2呢,都制成照从我们图纸上来讲的话呢,就是咱们这两根线呢,是不是就干掉了,不要了,这两根线干掉以后,我们这个两个对象实际上呢,就没有占空间的两个引用的指向了,其实呢,这俩就算是垃圾了。但是呢,如果如果啊是吧,咱们Java如果使用的这叫引用计数算法的话呢,大家想一想,那我们这里边这两个对象,他们的这个cer肯定不是零,因为呢,他们彼此引用啊,你需要我,我需要你,他俩呢,其实都不是零。那如果说咱们Java使用的是这种叫引用技术算法的话呢,是不是就会这两个对象呢,就没办法回收了,那就意味着我们内存空间当中是不是还会占用这个五各自五兆的一个大小,对吧?哎,就成这样子了,行,咱们先这样一下啊。
02:05
把这个程序写好以后呢,我先把后边这个叫C角JC呢,我先去掉。这个去掉呢,就意味着咱们没有显示的去调用过这个垃圾回收器,去执行这个JC,那当这个内存够的情况下呢,它就实际上没有发生过这个JC行为啊,那咱们这儿呢,使用一个参数之前呢,咱也讲过叫print j c details,看一下这里边发生的这个JC的一些情况,还有这个内存的一个占用情况,好这块呢,我们就直接找到咱们这个程序。啊,第15章没问题是吧,然后呢,就针对我们这个JC,然后CTRLV是吧,这是我们这个参数行已经放到这儿了啊,那针对它的话呢,我们OK一下做一个执行。出来了,这时候呢,大家会发现咱们上面呢,没有说什么什么JC说明呢,就没有进行过垃圾回收,那此时呢,咱们内存的一个占用情况,我把它那盯一下。这个占用情况里边大家能看到就是这个新生代啊,这么大使用了这么多啊,这么多的话呢,其实咱们一个呢是十兆啊,一个是五兆,两个加起来一共就是相当于十兆空间,对吧,主要呢,都放在我们这个伊甸园区了啊,都在这儿了啊这呢没有使用,所以主要呢就放在这了。
03:12
行,这呢是咱们说这个没有去这个进行过这个JC的一个场景,现在呢,我把它打开,那这个时候呢,我们就会显示的去调用这个垃圾回收,咱们就要看一下再去调用这个垃圾回收的时候呢,我们会不会把这个OBG1和obgr呢进行一个回收。那就看一下这个内存,你这块掉它跟没掉它如果说一样。对吧,相当于我们垃圾回收以后呢,这个内存还占这么多,说明他俩就没有回收啊,那你要是不一样了,这个就不一定了,是吧,跑一下啊。行,那么我在执行完以后呢,大家会发现我们上面呢,就发生过这个C增点GC这个行为了,那发生这个行为以后呢,咱们再来看一下此时这个内存的一个占用情况,这个时候呢,你看我们这是76288啊,7628这是一样的,然后它使用的叫655K,这呢是我们这么多K,那很显然这个655K呢,是不是说咱们连一兆都不够啊,因为一兆的话呢,好歹是不是1024K。
04:09
那这连一兆都不够,那就意味着咱们当前注意咱们当前的,你看这个新生代这里边啊,新生代这里边呢,你要存就光我们的伊甸园存这个数据,这个肯定乘不下咱们现在的这两个OBG1和OBG22个对象,那就意味着呢,咱们这个C增点这个GC,是不是说把这两个对象呢给回收掉了。你要没回收掉的话,那就不会说占用的这么少了,对吧?哎,肯定是回收了,那为什么能回收呢?咱们再反着推,那就意味着咱们Java呢,是不是使用的一定不是这个叫引用计数算法了。对吧,诶因为你要使用这个引用技术算法的话呢,他俩呢是不应该被回收的,而现在呢回收了,所以我们反推呢,就说诶咱们Java呢使用的啊通过这咱们证明哎,这个Java使用的哎不是叫引用技术算法。
05:02
哎,就是相当于咱们是一个类似一个反正法一样,就我们先假设个场景,然后最后呢,得出来这个结论的不对,我们进而呢,诶推翻我们的这个假设啊就是这样个情况,OK,那这呢,咱们把这个问题呢就能说清楚了,然后接下来呢,咱们就做一个小结了,说呢,这个引用技术算法呢,虽然说咱们Java没用,但是呢,还是有很多语言呢去使用了,比如说呢,咱们这个Python语言,那它呢,就是首先支持垃圾回收机制,那其实的话呢,它也支持这个叫引用技术算法。嗯,那具体呢,哪种优这个最优啊,要看这个具体的场景,业内呢,有大规模实践中仅保留引用技术机制啊,以提高这个吞吐量的尝尝试,就是我们之所以用这个引用技术算法,诶咱们看到的呢,就是针对于使用这个语言,他看到的就不是它的缺点了,而是看到它的这个优点,诶它的这个判定效率比较高是吧,没有延迟性,那对于Python的话呢,主要就看它的优点啊,不是特别重的看它的这个缺点了,那Java的话呢,咱们就相当于是主要看这个缺点,对吧。缺点呢,就是因为它解决不了这个循环营的问题,那嗯,虽然说这个Python呢,你看中的是它的这个优点,但是它毕竟也有这个缺点呀,那我们下个问题就是说Python怎么去解决这个循环引用的问题呢?
06:10
这个事儿是不是很正常?对吧,很正常,就跟我们说这个,呃,用人也是一样,那公公司里领导用人的话呢,呃,领导一般更多的看重是不是员工的这个优点啊,对吧,他也更多看重优点,那当然也有一些,呃,我们要考虑说他存在这样缺点,这个缺点你看是不是致命的,那如果致命的话呢,我们得考虑怎么去规避他这个缺点啊,那我们回头可以找一个,诶其他的人去弥补他这个缺点,因为公司呢,毕竟这个人数比较多嘛,从领导的角度,领导不能只领导一个人吧,他可以领导多个人,然后多个人之间呢,诶,诶使用他们各自的这个优点。可以这样是吧,达到一个最佳的一个效果,行,那既然这个我们说引用技术算法呢,有这样的缺点,那Python怎么解决啊,那我们怎么去规避它的缺点呢?两种方式。那这个当然了,面试的时候呢,注意现在呢,还没有问到这样的一个深度,那如果说哎,我要去面试的话呢,我就可能就会问这个被面试的者说这个引用技术算法它有什么问题啊,你说的OK,那现在呢,业界当中有没有语言使用这个应用技术算法啊,OK Python啊,Python用行,那么Python是如何解决这个循环引数引用问题的?
07:12
哎,就是我们一个问题呢,一直给它扎进去,看看你是不是把这个问题呢,彻底的是,哎,这个你的一个良好的学习方法是吧,把这个问题彻底整透了。OK,那么Python怎么去解决呢?这里边提到叫手动解除,就是很好理解,就是在合适的时机呢,我们解除这个引用关系,也就是说呢,你不是说你这俩指针这互相引用,导致他们这里边儿的各自的个数都是一嘛,所以回收不了怎么办呀,我显示的把这两个指针呢,都给它干掉,那你这里边就变成零了,那我们此时呢,就可以进行垃圾回收了。所以这叫叫手动的行为,OK,这是一个,那另外一个呢,就是我们提到一个叫做弱引用,那下一章当中我们给大家讲一下,叫强引用,弱引用,软引用,虚引用,对吧,分别是什么意思,那这个弱引用。是什么情况呢?啊,他呢,就是针对我们说这个,如果存在这个系统JC的话呢,只要发现了这个弱引用,咱们呢,诶不管这个内存空间够还是不够,只要你是个弱引用,我们就都回收。
08:06
那咱们如果是使用这种场景的话呢,他们用弱引用来表示,只要呢,你发生这个JC这俩就被回收掉了,所以呢,就也不会存在说这个内存的泄漏行为啊,就是循环引用的这个行为了。哎,通过这样的两种方式可以考虑呢,解决一下这个循环营的问题,OK啊,这个清楚就可以了。
我来说两句