00:00
前面啊,咱们对这个j first呢进行一个概述啊,大家呢,大体上对这个j first呢,应该有一个了解了,那么下边的话呢,我们通过几个方面啊来系统的介绍一下这个g first垃圾回收器的一个特点,或者呢,我们成为呢叫优势,诶毕竟的话呢,我们说这个g first呢,已经成为咱们JDK9之后的这个默认的垃圾回收器了,而且呢,我们能看到在呃相当的一段时间之内呢,呃,J first仍然是我们这个默认的一个垃圾回收器,那这个J类C的话呢,应该还是要花一些时间呢,再去做迭代的啊是这样的一个场景,那既然如此的话呢,我们这里边呃,花一些多的篇幅呢,去讲这个j first呢,其实也不为过啊,也是非常正常的,呃,那我做这个j first这个PPT的话呢,就做了能有三十来页啊,就有三十来页,呃,同时的话呢,这个也看了一些这个一些帖子啊,包括一些书是吧?诶专门来讲这个j first啊,当然比较失望呢,就是看这个书的话呢,啊,里边这个错误呢,还是很多的啊,当然这块呢,就是你需要具备相应的这个能力呢,你去辨别它里边到底写的哪些是错的那。
01:00
这比较要命的就是他在并行跟并发这方面呢,反反复的这个出错啊,这个呢,其实是对于这个初学者来讲是非常不利的啊,当然我这块看的时候是能够看出来的啊,就是从里边摘抄一些他的一些这个呃描述方式啊等等对吧?呃,但是的话呢,这个很失望啊,这个书写的其实并不好啊,其实并不好啊啊我就不说具体是哪哪个书了啊嗯,行,那这儿的话呢,我们就系统性的来介绍一下这个垃圾回收器,嗯,我们呢,诶,关于它的优点方面呢,提出来这样的四个点,第一个呢,叫做并行与并发。哎,并行与并发,第二呢,诶,我这儿呢叫分带收集,第三个呢叫做空间整合,第四个呢叫做可预测的叫停顿时间模型,通过这四个方面呢,咱们来介绍一下这个g first它的一个特点。诶大家的话呢,也没有必要呢去死记硬背,那如果说你在这个面试环节当中,诶想呢跟对方呢去说清楚这个g first,你呢,就可以按照这样的逻辑去说,诶但是呢,你不用死记硬背,按照自己的理解呢去表达就行,OK首先的话呢,我们来看一下叫并行与并发,前面的话呢,我们提到呢,说叫并行的垃圾回收器啊parallel或者这个叫panel等等是吧,并发的我们提到叫这个CMS对吧,那当然我们提到这个j first的话呢,诶它是兼具并行与并发的。
02:16
间距并行并发,首先呢,所谓的并行性,就是我们在垃圾回收期间呢,咱们可以让多个垃圾回收线程是同时工作,那能有效的去利用这个多核的一个运算能力,对吧?那这个时候呢,我们会出现叫STW,就只要是行的,大家注意啊,只要是并行的垃圾回收啊,那这时候呢,它就一定会STW。啊,一定会STW,那并发呢,哎,指的就是我们可以跟这个应用程序的线程是不是可以交替执行了,哎这个时候呢,我们就不用提STW这个事儿了,哎不用提这个问题了,那一般说来呢,我们不会在整个回收阶段呢,发生完全的这个阻塞应用的这个情况啊,那么为什么说我们这个J呢,就这么复杂呢?诶这个咱们后边呢会讲具体这个垃圾回收器这first呢,它在回收的环节当中,我们有新生代的这个样JC是吧?然后还有呢,呃,这涉及到几个环节哈,这个我们看下这个图也行先。
03:08
来看这个图,就是它涉及到呢,叫新生代的这个样JC,然后呢,还有这个年轻代,诶新生代是吧?诶跟我们这个叫并发标记环节呢,并发标记的这个环节,还有呢,叫混合回收的这个环节,就是老年代和我们这新态都出现了这样一个叫混合环节是吧?那么因为它在比较复杂了,所以在这个环节当中,我们相应的一些环节当中会出现并行,相应的一些环境当中,我们是并发的,诶所以呢,它是病情与并发呢,是兼巨的啊这个大家注意一下,然后在下边呢,我们提到呢,叫做诶在在再多说一句哈,就是大家如果有时候你看一些书的时候呢,我们通常呢,先把这个这份呢,先称为是一个并发的。啊,先成为是并发的,包括呢,它还有一些这个类似于我们之前讲的这样的一些图是吧,诶之前这样一些图,当然有时候你要看清楚啊,这个这份的话呢,咱们也在不断的去优化迭代啊,不断的优化去迭代,那么后期的话呢,实际上我们呃让他呢,从这个并发的场景当中,我们也改成了是一个并行的了。
04:00
啊,并发跟平行的区别呢,就是说我们是不是还也比较在乎这个吞吐量啊,那如果我们要在乎吞吐量的话呢,我们是把它要改成个并行的对吧?啊实际上呢,它是间距的啊这个大家稍微注意一下。然后下边呢,我们提到第二个特征呢,叫做分带收集,分带收集咱们一提到这个堆空间呢,就是说一个分带的涉及到叫新生代行间贷,对吧,那我们对应的也有这个相应的一些算法去回收这个垃圾,那从这个分带上来看呀,咱们仍然呢,可以把这个这份呢,看成是一个分代型的垃圾收集器。就是针对于新生代怎么着,针对于老年代手怎么着,对吧,那它呢,会区分这个叫年轻代和老年代,那年轻代呢,我们有这个叫伊甸园区和两个survivor区啊,是这样子的对吧?啊,但是呢,从整个这个堆的结构上来看,咱们又不要求啊,这些结构呢,是连续的,什么意思啊,就是咱们呢,前面讲新生代的话呢,是不是这块空间就是新生代的啊,然后里边呢,又分成这一部分呢,是叫一甸源区啊,下边又分成两个相等的叫survivor区,这都要求呢,他们是逻辑上是连续的,对吧?但是现在的话呢,我们说不要求连续了啊,为啥呢?哎,这里边主要原因是因为我们提到叫region的一个概念。
05:07
也就是说呢,虽然这个g first呢,我们还把它看作是分代型的垃圾回收器,但是它的这个分代啊,已经不是这个样子了,伊甸园区urvival区纯的老年代啊,不是这样子的,是什么样的呢?改成是这样子的,花花绿绿的一个一个的小方格,这一个小方格呢,我们就称为一个呢,叫region。就成为一个region,然后呢,具体的这个region的话呢,它可以用来存放啊伊甸园区的数据还可以呢,是survivor区,还可以是这个old的区啊,这块呢,还提到一个啊,我们叫句型对象是吧,哎,还可以是这个H区,这个我们后边呢,再专门介绍它啊,再回过来啊,再回过来行,就是我们呢将这个对空间呢,分成了若干的region,用这个region啊,咱们去表示啊,牺牲代的伊甸园区也好,这个svi区也好,还是老年代也好,所以呢,这个时候呢,我们就不要求你看这里边所有的这个,你像这个E表示的叫伊甸园区,它们是连续的了,哎,它是可以分隔的,而且的话呢,一旦你这个,比如说伊甸园区你被诶垃圾回收掉以后呢,它就是个空白的了,对吧,那你这个空白的这个,呃,瑞典的话呢,下一个时刻呢,有可能它就充当了叫survivor去了。
06:14
啊,就是但是但是你你注意啊,不能说这一半放这个survivor一半放这个叫呃伊甸园,这是不可以的,哎,这一个region呢,它专门放的,就只能充当一个角色,但是他这个角色呢,在他清空以后呢,是可以换的,所以呢,我们也就对应的,他们就不要求呢,是不是叫要连续的了,而且呢,我们也不用坚持固定大小和固定数量了。对吧,诶因为呢,他这个我们是可以做一些调整的哈,做一些动态的调整。然后这呢,就是我们就是设置的叫region啊,因为这个region的存在呢,所以我们也常常把这个j first称为叫分区算法是吧?哎,这个区呢,指的就是这个region的意思。啊说和之前的各类这个回收器不同,它同时兼顾了年轻代和老年代,哎,这个咱们都知道了是吧,然后对比呢,其他垃圾回收器或者呢,是年轻代的或者是老年代的,它呢是两个都兼顾,那因为呢,我们这儿呢,就是针对的叫分区算法了。
07:05
对吧,哎,针对这个叫分级算法啊,行,这是我们说的这个第一个特征,哎,大家记住我们说的是这两个图,然后这个下一个这个特征的话呢,我们提到叫空间整合。那这个呢,我们称为它叫空间整合,什么意思啊,这个呢,主要是针对我们说这个碎片化的问题哈,CMS的话呢,我们叫标记清除算法,那它呢,是会存存在这个叫内存碎片的,咱们呢,诶可以在若干次这个GC之后呢,进行一次碎片整理,咱们讲CMS的时候呢,是不是也讲到过那个参数是吧?诶我们可以设置呢,在几次之后呢,进行这个相应的这个forc啊,进行内存空间的一个整理。OK,那么这first的话呢,它呢将内存划分出来,叫一个一个的region啊,一个一个region,那么这个region它们之间啊,不是之间就是region内部是吧?咱们要回收这个region了,它呢使用的这个叫复制算法,那也就是说呢,你这个region当中这个存了很多数据了,那如果要回收的话呢,我们会判断里边呢,哪些数据呢,还有用,那有用的这个数据呢,我们要给它呢,是不是叫通过复制算法,呃,复制到呢,相应的另外这个region当中这个呢,就是叫复制算法,比如你这叫伊甸园区,那你这个是survivor区,那这块呢,就把它呢复制过去。
08:13
诶,这用的叫复制算法,那复制算的话,复制算法呢,咱们知道是,呃,有这个内存的一个整理过程对吧,所以它不存在这个碎片,然后从整体上来看呢,它又是一个标记压缩的。啊,整体上看是个标记压缩的,比如我们这块数据呢,要回收它会整个呢,就会把它摆放到比较整齐的一起,诶,所以整体上是标记压缩,那标记压缩的话呢,本身是不是也能够解决这个碎片化的问题啊,所以这两个算法呢,都能够避免碎片化。嗯,能避免碎片化,这就我们这个空间整合呢,就比较好一些,那这种特性呢,特别有利于程序的长时间的一个运行。哎,特别有利于长时间运行分配大对象呢,不会因为说无法找到连续的空间呢,而触发一次GC,这个咱们能理解是吧,说尤其呢是当当这个Java堆非常大的时候呢,这一的优势啊会非常明显。
09:01
这个优势非常明显呢,其实在我们这个位置放呢,还不是特别的明显啊,就是我们说到下个特性的时候呢,大家能够去理解说这个堆大的时候啊,这个J的优势呢,就来了。堆大的时候呢,这一点优势来了,为啥呢?因为我们可以选择的空间大的时候呢,咱们呢,诶在指定的这个暂停时间之内,咱就挑那个,呃,回收价值比较高的去回收,那其他这个呢,我们照样还能分配内存,那你空间越大当然就越好了。能理解吧,哎,空间越大就越好,就跟说呃,你想踢球,你想踢球是吧,踢球的话呢,你这块我给你的空间越大,你是不是施展的就越能施展开就更舒服一些是吧?哎,或者这个厨房一样啊,哎,你像我家这个厨房呢,就相对来说比较小一些,你要进去两个人呢,就都满了,所以只能一个人做饭,哎这样想还挺好是吧,那这个就不用我做饭了哈,哎,就一个人能做饭,就是你发挥的空间呢,有点有限啊,你这要是个大厨的话呢,这个还抡不开呢是吧?哎,那你这时候你像我们这个这份的话呢,这个性能非常好是吧?呃,基于这个region啊这样的这个结构,那region呢,我们可以设置的比较多啊,几千个是吧?哎,然后这个时候的话呢,你这个空间大一些的话呢,我们只回收那些呃价值比较高的,那其他的呢,都还可以去分配,那同时呢,我们也可以降低是不是这个JC的一个频率啊,哎,这都是它这个比较好的方面啊,哎,就提到这个大大堆啊比较好。
10:20
行,那么这个第四个特点的话呢,我们称为呢,叫可预测的叫停顿时间模型。可预测的,或者就是也可以理解成呢,就是我们可以去限制它指定的一个停顿时间啊,最高的停顿时间,这呢我写了一个叫软实施soft real time,这个咱们一会儿说啊。嗯,这呢也是我们这个这份呢,相较于CMS的一个另一个优势,说这个这份呢,除了追求低成顿之外。这个CMS我们说叫低停低延迟对吧?诶追求这个叫低停顿之外呢,咱们还可以去建立叫可预测的停顿时间模型。能够让这个使用者明确指定一个在长度为M毫秒的时间段之内啊,消耗在垃圾回收这个上的这个时间不超过这个N毫秒。
11:04
不超过这N毫秒,那么我们这个M呢,减去这个N,再除以我们这个M,这是不是就我们这叫暂停时间呀。你不是咱那个时间的话,应该就就就就它了是吧,咱我刚才那个列的这公式呢,是咱们这个叫吞吐量是吧?吞吐量啊M呢减去N,这就是说你你执行用户线上呢画的这个时间,再除以我们这个M啊这个呢是衡量的叫吞吐量了哈。暂停时间呢,就指的这个N,我们尽可能的希望这个数值呢,控制在这个N毫秒之内。啊就是这样子的,那下边我们就提说,由于分区的原因,咱们呢,这个只选取部分的区域啊进行一个回收。以前的时候呢,我们说要么新生代全回收,要么老年代全回收,是吧,这个时候我们不了,我们只回收一个一个的region。啊,回收一个region,这样呢,我们就缩小了一个回收的一个范围,那对于这种全局停顿的这个情况呢,哎,我们就得到一个很好的控制,不让不用不着全局停顿了,是吧,我们只针对一部分的这个region呢,进行一个停顿啊进行一个回收。
12:03
那么回收哪些RA呢?这时候我们就需要跟踪各个region的一个价值,所谓的价值呢,就是回收以后我们所获得空间大小,以及呢,回收所需花费的这个时间的一个经验值,那我们呢,会有一个优先列表,那每次呢,根据允许的这个收集的时间,我们优先回收价值最大的一个region,那就相当于是我们排个序,上面呢,比如说是这个价值最大的啊,我们依次往下排,然后的话呢,我现在要求是十毫秒,诶说诶那就这俩加起来正好是十毫秒左右,那就他俩回收,那我现在来了一个叫哎,50毫秒啊50兆秒,我们还可以把后边这两个也补充上,就根据你限定的这个最大停顿时间,我们呢去从从这个价值从高往低我们去选择,哎,要进行垃圾回收的这个region。啊是这样的,这呢就保证了咱们这个G1收集器呢,在有限的时间之内呢,可以尽可能高的,是不是有一个收集效率啊啊,我们选择的是价值最大的对吧。就跟说这个,呃要这个国家要扶贫一样是吧,那扶贫的时候呢,全国这么大,呃你不能说这个北京在这儿,然后呢,扶贫我们先就从从近到远吧,那近的话你发现呢,其实都没有那么穷,那我们要扶贫的话呢,是不是先定位到那些真正呃在山区里边或者西部地区,真的家里边儿条件非常差的那些家庭,就是呃年收入可能只有几千块钱,甚至1000块钱的那样的家庭是吧,先把那些家庭呢,我们给他复制的,然后呢,你再呃扶植那个,比如说呃一年呢,才能挣几千5000块钱的啊,一年才能挣1万块钱的,一点点往上赶。
13:32
啊,先找那些真正意义上的这个贫困的家庭是吧,或者说最贫困的家庭就是我们要回收在这儿呢,就是回收价值最大的,这个叫region啊。那相比于这个CMS的话呢,这个G份未必能做到,那CMS在最好情况下的延迟时间,延迟停顿时间,但是最差的情况下也比它好,这个能理解吧,就是CMS呢,最好的这个情况下呢,咱们G1呢,可能比不上,可能比不上是吧,但是你这个CMS最差的场景下呢,我们一呢比你做的要好。
14:02
啊,因为毕竟呢,它是有这个按照region是吧,分区这个算法在啊,就这呢,实际上是j first一个挺牛的一个主要的一个idea在这是吧,哎,支撑我们整个这个分区算法。啊,那我这呢,还写了一个叫软实时啊,Soft real time,那什么叫实时呢?先明确是吧,哎,我们所谓的这个叫实时的垃圾回收,指的呢,就要求你在指定的时间之内,比如说呢,叫十毫秒,十毫秒之内,你必须呢得把这个垃圾全部清理掉啊,就是结束你这个stop the world这个时间。这呢,我们称为它叫实时垃圾算法,呃垃垃圾回收算法,那么soft呢,软实时啥意思啊。就是诶稍微的弱一点是吧,啊,就我们说这个强饮用跟软饮用一啊,这个软石的话呢,就是我们尽可能的啊,在你给定的这个呃,时间之内呢,我们把这个垃圾回收给他搞定。啊,比如说呢,我们有90%以上的这个把握,能够控制在这个十毫秒以内。啊,这呢就是我们称为呢,叫做软实时,因为毕竟呢,我们在回收过程当中,这个CPU呢,有可能还有其他的一些任务要执行,对吧?哎,它有可能呢,会导致我们这个时间呢,最后超出这个十毫秒,这是有可能的,但是我们尽量的这个以更高的一个概率呢,让它在指定的时间之内去完成。
15:15
所以就是可预测的一个听证模型,但是不是说极其准确的啊,预测是不是不一定准啊,买股票就知道是吧?啊他要准的话呢,那大家都买了就啊行这个呢,就是我们说的这个可预测的停顿时间模型。这儿呢,就是我们给大家讲的这四个好处啊,或者叫优势并行与并发分带收集啊,这个空间整合,以及呢,叫可预测的停顿时间模型,那大家呢,用自己的语言呢,能够去整合一下就可以了,然后接下来的话呢,我们再补充一个啊,任何事物呢,我们说都有利有弊啊,咱们光说它的好的方面了,那你有什么缺点呢?诶,缺点这块呢,我们也可以给他稍微的介绍一下啊,整体上来说呢,这个g first还是非常优秀的一款垃圾回收机啊,可以说呢,是目前为止咱们应用起来的,就是商业化以后的这个垃圾扩除剂当中,这个工程师智慧的一个结晶。
16:06
啊,一个结晶了,但是呢,它还是会有一点这个,呃,不是那么令人满意的地方啊,我们也稍微提一提啊,就相较于这个CMS的话呢,我们说这个这first它还不具备叫全方位压倒性的这个优势。呃,完全碾压这个CMS是降维打击这个还做不到啊,大家呢,现在还都是都还是人是吧,你就跟说这个博尔特啊,实际上博尔特的话呢,已经是非常的夸张了是吧。呃,博尔特大家应该都知道啊,这个百米飞人,他已经连续很多年这个霸榜,这个百米飞人的这个榜单了啊,就是排第一是吧,冠军的这样一个角色啊,就是呃,但是的话呢,他还是跟其他的选手的话差有差别,但是差别还不是那么明显,就是他不能保证他跑的话呢,就一定绝对优势呢,去胜利对吧,因为毕竟呢,他还是人,其实这个体育竞技的话呢,之所以好看呢,我们说就在这一方面啊,就是呃,五个人去参加比赛,不管你是这个田田在也好,还是竞赛也好是吧,参加比赛的时候呢,最终结果谁胜了这个呢?呃,看不出来,就是大家呢,都没有绝对性的这个把握呢,说他就一定是冠军。
17:11
啊,要那样的话呢,就没什么意思了是吧?啊呃,足球你像足球也是这样啊,正因为呢,这个这个竞技比赛呢,它有这样的一些元素在里边,所以我们才觉得它有意思是吧,它好看是吧,里边也反了,反映了很多这个人类的一些坚持不懈的一些精神啊。呃,那么对比来看呢,就是咱们国家的这个乒乓球嘛啊,为什么现在说这个国际这个乒乓球协会不断的去改革啊,因为实在是太无聊了是吧,那中国人一打的话呢,就完虐其他国家对手。啊,就中国人一队,其他国家一队啊,那都不行是吧,中国人再再派几个过去,可能还有的一拼,你现在呢,就是一打你中国人就就排第一,那都没意思了,失去了这个竞技的一个乐趣啊,就完全碾压式的了啊,那现在的话呢,我们说就这它还不具备这种全方位的这种碾压式的这个功能。啊,还不具备这种降维打击的这个能力啊,那比如说呢,我们在这个用户程序运行啊,应用程序这个运行的过程当中,这个这份的话呢,它无论是为了垃圾收集产生的这个内存占用。
18:09
啊,还是这个程序运营过程当中,额外呢,这个执行的一些负担啊,都要比我们这个CMS呢要高。还比CMS要高,或者换句话说,这个G啊G份的话呢,它需要占用额外的这个内存空间。啊,这个大家可能现在某一看呢,还不是特别理解啊,咱们下边后边要讲一个叫做remember set啊,叫remember的set啊,叫做记忆集。啊,就是咱们呢,说这个j first它不是主要呢适合这种大堆嘛,是吧,那大堆的话呢,我们要是回收这个垃圾的话呢,咱们尽量是不是要避免进行这个全堆的一个扫描啊,说找找有哪些叫JC入此是吧?啊你想想如果我们要进行这个全堆的一个扫描的话呢,在扫描的过程当中,它一定得是一个STW的,那你这个堆比较大啊,这时候SW呢,导致这个停顿时间一定会比较长一些,那怎么能够避免这个事儿啊,咱们就引入这个概念呢,叫做remember的set啊,叫做记忆级。
19:04
啊,同时的话呢,我们说由于这个region的数量呢,比咱们传统的垃圾回收器那个分带的数量其实明显要多的,我们有几千个这个region。啊,所以说呢,我们这个J垃圾回收器呢,它比我们说传统的这个垃圾回收器呢,它具有更高的一个内存占用的一个情况。啊,它就额外的这个负载呢,就比较多啊,从经验上来讲呢,咱们这个g first呢,相较于其他的件回收器来讲,它呢,至少啊,它有10%诶到20%的一个额外空间的一个占用,诶额外空间内存的一个占用,它才能够去完成它的一个诶高性能的一个展示啊其实这个呢,我们也能够去理解啊啊你像我们说一个算法的话呢,时间复杂度好了,是不是相应的空间占用就要多一些啊。啊,就是这样的,它是一个此消彼长的,或者也是我们说辩证唯物法的,哎,辩证唯物主义啊,或者唯物辩证法的这样的一个,呃,逻辑是吧,也很好理解啊。那么从这个经验上来讲的话呢,在这个小内存的应用上的这个CMS呢,它的表现呢,反而比我们这个G呢要好一些啊,那么这个平衡点呢,大概是在这个六到8GB的时候,在这个区间之内呢,它俩呢是差不多高于这个数的话呢,我们这个G份它的优良性能就发挥出来了。
20:14
啊是这样啊行,那么刚才呢,我们花了一些时间呢,介绍一下我们这个j first垃圾回收器的一些特点优势啊,包括它的缺点。
我来说两句