00:00
咱们承接啊,刚才问的这个问题说难道就没有一种最优的算法吗?哎,那我们这块呢,来看咱们下边说难道没有一种最后算法吗?没有,哎咱们的结论是没有最好的算法,只有呢最适合的算法,那大家呢,你回想一下,咱们讲这个数据结构里边提到过是不是排序算法,那排序算法的话呢,我们稍微的一列,是不是在内存级别呢,就有十种算法呀,那你想想,如果说呢,排序算法有一种是最优的,那其他的这个算法呢,都不如它,那其实我们就用不着整十种了,那九种是不是直接就干掉就完了,但为什么我们这十种排序算法还依然存在呢?因为他们在各自的场景下,或不同的这个实际开发环境当中,我们使用不同的算法呢,他们这个表现出来还是不一样的的,对吧?哎,你说你所谓的这个最好的这个呢,发现在某一些极端场景下呢,它并没有其他的一些算法执行效率,执行效率高,那所以呢,我们还要考虑其他的这些算法,也就是说我们这十种算法呢,都在具体的他们擅长的这个,呃,这个场景下呢,他们的效率呢,反而是最好的,所以说呢,诶到我们这块也是一样说呢,垃圾收集方面有没有说一。
01:06
这最后的算法呢,我们也只能说呢,叫具体问题具体分析。啊,这个词呢,简直是太好了是吧,诶大家在面试当中或者生活当中,诶别人问你说这个东西怎么去解决啊,诶可以有一些理论啊,1234,那那或者说呢,你这块不熟悉的时候,你就可以来一个叫具体问题具体分析,那这句话肯定他错不了,对吧,我们很难说有一个准则,这个准则呢,放置四海皆准的。啊,你包括炒股也好,这个等等也好是吧,哎,如果要是有一个所谓的这种真理性的东西的话呢,那大家都去学,那不是所有人都学会了吗?啊就像大家呢,这个也有的人炒股,看这个巴菲特的这个呃,写的一些书是吧,他的发表的一些理论啊,但是的话呢,你想你如果说仅仅就是按照他给的这个所谓的这个真理是吧,你去操作的话呢,你可能还是成不了巴菲特,因为还是得具体问题具体分析,因为现实情况呢,实在是太复杂了,那巴菲特呢,就只有一个对吧。
02:01
啊,你看我下边放了三个图是吧,说这个嗯,你想选谁做自己的女朋友呢是吧?呃,第一个啊,这个韩红给韩红的话呢,我们说这个,呃,人非常的有社会责任感,对吧,尤其是像前段时间这个疫情的时候呢,这个啊非常努力的在筹钱啊,给这个武汉,包括给湖北省,然后呢,去呃解决一些物资的问题啊,应该说是非常的了不起的啊,我觉得是值得咱们去学习的。啊,当然呢,你说呃,让韩红如果做你的这个女朋友的话呢,你愿意吗?啊,因为总感觉看到韩红的话呢,这个总想叫这个韩红大哥是吧?嗯,那下一个呢,呃,你说这个选张韶涵呢,呃,张韶涵呢,这个人美声甜是吧,但是呢,感觉这个身高的话呢,稍微差点意思。啊,就这个也再考虑考虑啊呃,选这个志玲姐姐吧,呃,形象比较好啊,气质也比较佳啊,但是呢,人家已经结婚了啊,你这总不能去撬人家这个那个婚姻关系吧,啊至少人家是刚结婚没多久,还热乎呢,你这时候撬也撬不动是吧?哎,所以呢,都会有他们相应的一些弊端啊那怎么办呢?哎,那我们这时候呢,只能叫具体问题具体分析,哎,在不同的场景下呢,这个我们跟不同的人约会是吧,就是成这样了啊行,那我们来看一下,这里边所谓的叫诶分代收集算法,这个呢,就是咱们所谓的叫具体问题具体分析,咱们得出来的一个词,或者叫所谓的一种算法啊,叫做分代收集算法,但是这块你注意,它并不是一个真正的上,就像我们前面讲的那三个算法一样啊,诶不是这样子的。
03:32
啊,他呢是针对于咱们说内存空间,呃,咱们不是给内存空间分代了嘛,新生代老年贷是吧?啊这个伊甸园区survivor区,那根据这个带呢,呃,咱们呢,具体问题具体分析,看看使用前面的哪一种,OK说前面的使用这讲讲的这些算法呢,他们说呃,没有一个完美的啊可以去替代其他的算法,那我们只能是兼顾到他们各自的这个优点,优势和特点,那这个分带数据算法呢,就应运而生了,它呢是基于这样一个事实,说不同的对象的生命周期啊是不一样的。
04:03
啊,因此呢,不同生命周期的对象呢,咱们可以采用不同的收集方式,以便呢提高回收效率啊大家你想想咱们那个所谓的招生夕死的那些对象,他们生命周期就比较短,对吧?哎,我们说用这个复制算法呢,就相对来说就比较好一些,就我们得照顾到他们这个不同的生命周期,那比如说呢,像我们这个在成语当中呢,使用的这个string的对象,因为呢,它是这种不变的特性,你只要呢,去这个对这个string呢,进行一些呃运算或修改的话呢,这个必须得新创建一个对象了,咱们前面是不是专门给大家讲了一章叫做string对吧?啊你会发现呢,如果你这个当前的这个string对象呢,就只用过这一次,它的生命周期其实就可以比较短,用一次呢,你就可以考虑回收。那么对于这些,比如说我们HTP请求当中的这个session对象,包括这个线程,包括我们说这个socket的连接啊,L流流资源的一个连接等等,像这些资源的话呢,我们使用的时间呢,就比较长一些啊,因为它跟具体咱们这个业务呢,是直接挂钩的,那生命周期比较长呢,我们就可以考虑用不同的这个哎垃圾回收算法进行回收。
05:03
哎,主要呢,咱们就考虑到各个堆空间中这个带的这个不同特点,我们使用不同的这个回收算法,以试图提高回收整体上的一个效率问题。行,那我们看一下具体的一个情况说呢,呃,首先呢,盖个帽啊,说目前呢,几乎所有的这个垃圾回收器呢,都是采用的叫分带收集算法来实现的。诶分带手机是吧,那在咱们这个house SPA虚拟当中,基于分带这个特点,咱们呢,考虑一下这个年轻贷和老年贷各自的特点,首先呢,说这个年贷啊,或者叫新生贷啊,咱们前面讲内存结构应该大家都非常熟悉了,说这个年轻贷这个特点啊,就是区域呢,相较于这个老年代啊比较小,那对象的生命周期比较短,存活率呢比较低,回收呢是频繁的,那大家你想想回收比较频繁。那就意味着咱们回收的次数呢,是不是就比较多,那么回收次数比较多,那如果每一次呢,效率都比较高,那累加起来是不是要好一些。哎,咱这个逻辑非常严密啊,大家能跟得上,就是回收比较频繁的话呢,因为次数比较多,那如果每一次呢,效率都很高,那累加起来呢,效率肯定也高,那在咱们这些算法里边,是不是复制算法它的效率是最高的呀,那我们诶多次的这个复制算法累加起来肯定是效率也是最好的。
06:16
啊,这是其一,其二的话呢,就是对于我们这个新生代的对象来讲呢,诶恰好他们的生命周期啊还很短,存活率呢还比较低,朝生夕死对吧,70%~99%的这个对象呢,都是朝生夕死的,那咱们这个诶复制算法呢,它恰好诶就是要求你存活的对象呢,还真不要太多,你要太多的话呢,我们都给你去复制,极端情况呢,就是100%的都没死复制那就崩溃了。那恰好呢,咱们这个复式算法呢,也正好吻合它这样的一个特点,那简直呢就完美了。对吧,那你说还还有一个弊端呀,你复制算法是不是需要成倍的这个内存空间啊,我们要复制嘛,是不是得有两个区域,那这两个区域呢,在咱们这个新生代这块呢,咱们通过这个survivor呢,来进行一个缓解,诶什么意思啊,这怎么只能叫缓解呢?因为咱们说默认情况下呢,这个新生代跟老年代呢,是不是1:2对吧?诶然后同时的话呢,我们这个所谓的新生代当中呢,它有伊甸园区呢,是占默认的是八,诶此外区呢,是8:1:1,那这时候你会发现呢,咱们所谓的这个成倍的这个空间呢,它其实整体上来看呢,占用的并不是太大。
07:23
是这意思吧,我们这个1/3的区域呢,是新生代,新生带里边呢,有2/10的这个区域,或者说你换句话应该说1/10的这个区域呢,是浪费的,你是一个需要空闲的一个区域,其实它这块比例呢,并不是特别高啊,你可以考虑就是先是1/3,然后再乘一个,是不是1/10相当于1/30的这个空间呢,才是浪费的一个空间。啊,所谓的这个浪费呢,咱们加上个引号啊,哎,对,不是真正的浪费,只是我们复制算法需要的这样的一个场景啊,需要的这样一个空闲区域,行,所以说呢,这块呢,其实并没有说浪费太多的这个呃空间啊。OK,那基本上咱们就定下来,在年龄代当中,咱们使用的就是叫复制算法,下一个叫老年代,这个老年代的这个特点呢,说区域啊比较大啊,2/3的区域呢是老年代,然后呢,它这个对象的生命周期啊还比较长,存货率呢还比较高,回收的频率呢还不算高,呃,基本上跟咱们上面说的这个新生代啊,这个好像就是完全相反的这个特点,对吧?那既然如此,那咱们首先呢,就别用复制算法了,那不用复制算法,那无外乎呢,就是标记清除算法和标记诶整理或者叫标记压缩算法了。
08:30
那怎么办呀,那那这时候我们通常情况下用的就是他们的一个结合,那结合的话呢,就尽量的是考虑到他们各自的这个优点,对吧,诶我们去搭配的这种去使用啊下边呢,关于咱们这个说到标记清除或者标记整这个整理或者叫压缩里边的这个点,首先呢,是这个标记阶段,标记的时候呢,说他这个开销呢,跟存活对象的数量是成正比的。能理解吧?啊,因为呢,咱们标记的时候呢,是不是需要呢,便利所有的能够跟咱们这个所谓的这个根节点关联的这些对象呀。
09:04
啊,关联的这个对象,那这呢就是你到底存活的对象多,那这时候呢,肯定便利的就慢一点,你说就只有一个咔一走就完事了啊跟你存活的这个对象呢,多少呢是成正比的啊OK。嗯,然后。行,那么下一个呢,就是这样,呃,Swift这个环节就是我们说的这个叫清除环节,清除环节的话呢,它的一个开销呢,跟所管理区域的大小是成正比的,因为咱们这个清除呢,又进行一个是不是全堆空间的一个线性的便利啊,所有的都得走一遍,那你这个呢,空间你大的话,肯定是花的时间就要长一些嘛。对吧,呃,咱们老年代的空间确实还相对说比较大一些啊,然后呢,这个呃,标记整理或者叫压缩,这个压缩的这个环节的话呢,它的开销跟存活对象的数量成正比。开销,那我们存货对象多,是不是开销就大一些?啊,因为呢,你想想。找到我们这个图。哎,这是复制了啊,再往下找这个图,你这块呢,诶,我们存活的对象这个绿色呢,如果比较多,那你这时候是不是需要整理的这个就多一些,哎,就是跟我们这个存活对象的这个呢,也是成这个正比关系的。
10:09
哎,成立个正比关系,行,哎能明白我们这里边呢,哎说的这三个词分别是什么意思,哎,大家能够去理解啊,行,那么先明白这个事以后呢,咱们下边来看一下这个老年代咱们该咋整呢?那这里边我们就提到了在老年代这个回收方面啊,像咱们后边呢,会提到这个叫CMS,这个CMS呢,是针对于老年代的一个垃圾回收器啊,针对于老年代垃圾回收器,那么这个CMS呢,以它为例呢,它呢就是诶先呢,注意它是基于叫标记清除算法来实现的。那么标记清除算法相较于标记整体算法的好处呢?是不是它这个效率稍微来说快一些,对吧?诶稍微的效率高一点,但是呢,你这个标记清除算法它是不是有这个碎片化的问题啊,那怎么办呀?诶咱们说呢,在CMS如果出现相应的一些failure啊,就是failure啊,你出现这个呃,执行失败的时候呢,我们诶再给它配备一个,嗯,就是一个叫什么备胎是吧,叫Siri o,这也是我们要讲的一个叫串行的一个垃圾收集器,针对于这个老年代的,那这个Siri o的呢,它使用的是叫啊标记整理或者叫标记压缩算法。
11:14
哎,标记压缩法压缩算法,那就相当于我们既考虑到呢,使用这个mark sweep呢,它的一个效率啊,相对来说好一点,但同时的话呢,我们在考虑进行碎片整理的时候呢,我们再用一个备胎啊sir o,然后实行一个叫标记整理或者标记压缩,把这个内存的碎片化问题呢做一个解决。哎,采用的是这样的一个混合方案,其实是啊,那这呢有一个一个典型的一个例子,那具体呢,咱们讲到这个第,哎就是下下章的时候,我们再说这个问题啊,因为呢,在这个JDK像14当中啊,前前段时间发布这个新车型里边,关于这个CMS的话呢,还做了很多的这个调整,到时候咱们再说。说分代这个思想呢,被现在的所有呢虚拟机广泛的去使用,几乎所有的垃圾回收器啊,都是区分新用代和老年代的,后边呢,咱们再讲这个关于g first的垃圾收集器,哎,它是具体怎么实现的,诶跟这呢又有一些区别,行,那么这里边呢,大家记住一个词,就是我们讲完三种啊清除的算法之后呢,大家记住咱们最终实现呢,是基于咱们houseor的这个内存,尤其是这个对空间分分带的这样个特点呢,我们具体使用的呃就是呃分带数据算法,换一个词呢,就是我们生活中所谈的叫具体问题,呃,具体分析是吧。
12:29
哎,针对新生代怎么着,针对老年代呢,怎么着,OK,哎,就是这样子的。
我来说两句