00:01
好,那接下来的话呢,咱们就来看一看具体的这些垃圾回收器啊,这些垃圾回收器啊,实际上我们在讲上面的时候呢,主要的也都提到过了,这儿呢,也算是一个回顾啊,首先的话呢,诶,我们要谈的就是这个CJC啊,C串行的是吧?哎,一提到这个串行的话呢,我们这块呢,要想到的几个点就是针对于我们这个,呃,硬件这个配置比较低的场景下,我们才会去使用这个CJC了,对吧?诶你看这里边提到了,在hotport可烂这个模式下,我们新生代用这个C肉啊,老年代的话呢,就是CO了。啊呃,这里边我们那个这个前面讲的内容不是提到过吗?说这个client模式下呢,只要你这个32G的这个操作系统下,只要呢,你的这个呃,CPU呢是两以上啊,然后内存呢是2G以上,呃这个时候的话呢,我们是不是就推荐你改成那叫模式了啊,那你像在模式下呢,相当于你比如CPU呢,是不是就可能是一个内存呢,也小于这个两个G的是吧?哎,接着就用的这个叫CJC。哎,针对于我们这个硬件配置比较低的场景下,我们才会用这个CJC的啊,你总不至于不回收吧,哎,总得有一个回收期是吧?哎,就是这个CJC啊呃,它呢主要呢,就是在这个单核的CPU下我们去执行啊,那相应的来讲呢,你想想啊,从这个单核的CPU它只有一条这种执行线程的情况下的话呢,就是用户线程跟我们这个垃圾回收线程不能同时执行了,对吧,那单独这一条线程如果执执行这个垃圾回收的话呢,它肯定这个执行效率呢要很高,比我们下边这些并行的,那当然要靠谱了,哎当然呢,相应的这个缺点的话呢,就是用户现场你就得停下来对吧?哎,硬件配置呢,因为也比较低嘛,这种啊呃,那对于我们说交互性比较强的这种场景呢,我们就不用不能用它了,像Java web这种这个服务器啊,用户端啊,这种交互的这种项目,那我们只能是使用这种并行的啊,那后边我们还有这个并发的是吧?好,那如何去调用这个CJC啊,那我们就使用这样的一个简单指令就行了啊,就是use c j c啊,真的是一个波型的,就加上就行啊,这个呢,你一旦写上之。
01:58
呢哎,我们说呢,不光新生代我们用的是这个CE肉这些了,哎,老年代呢,他也会帮我们把这个CE肉O的这些呢也调用起来,那他俩呢,就相当于是搭配起来的嘛,哎把它一起用,它也就跟着启用了,所以呢,关于这个SE肉这些呢,这个没啥可说的了啊,就直接过了啊。
02:14
在特定的这种低配场景下,我们才会使用,那第二呢,叫做piel回收器啊,这个piel的话呢,典型的一说,那是不是就叫做并行回收器啊,哎,这个PI new呢,就看的是我们S的一个并行的版本就可以了啊这个PA呢,就是parallel的意思,就是我们下边这个单词啊,Parallel就并行的意思,New呢,主要说针对的是叫新生代对吧?哎,针对的这个新生代啊,那关于它的使用呢,这里边主要提到两个参数,呃,手动的我们去启动一下这个panel jc啊就可以了啊,年轻代呢,使用的这个叫并行的,它老年代呢,呃,因为这哥们呢,他能搭配的你看就很有限了,是吧?呃,W就很有限了,呃,这个呢,老年代用谁你还得自己再去指定一下啊,你看从这个图上来看,这哥们儿现在有点惨了啊,为啥呢,你看这个,呃,这这个八已经被de了,九张已经被删掉了啊,就是跟这个CO呢搭配不了了,然后呢,这个CMS呢是我们在这个十当中啊,这已经是一个大趋势了啊,虽然说现在在企业里边还没怎么用这个JDK14呢啊,但是呢,可见啊,后边的这个CMS呢,肯定要被干掉了啊,就被冷落了,呃,CMS的话呢,你看干孤立。
03:24
孤立无援了是吧,哎,所以这块呢,大家对于它呢,也做一个了解就行啊,你看我这块参数上写的都很少啊。呃,那也稍微提一下啊,使用这个参数呢,是把它开启,然后呢使用这个参数,这个我们在后续的这些呃,垃圾回收器当中也能够看到这样一个参数,就是设置这个并行的GC的一个线程数,诶默认情况下呢,跟咱们这个CPU的这个数量呢,是相同的啊,当然这个呢,要详细点讲,是CPU的个数低于八个的时候呢,跟CPU个数相同啊,CPU数量超过八个的时候呢,它会有一个公式啊,这个公式呢,在下边这块应该也写到了啊,就这样的一个公式是吧?啊一会呢,提我们这个parallel的时候呢,我们再说啊,嗯,Piel这块呢,就没啥可说的了啊。
04:03
这个呃,到后边版本来看呢,这就孤家寡人了是吧,那就不用了啊,诶这块就过了,下个呢,这叫powerel啊,这个呢,我们还是需要去提一下啊呃,首先的话呢,提到了就是呃,咱这个EL啊JC啊,在GT8当中它属于默认开启的啊,咱们刚才在这块测试不也看到了吗?相当于呢,它就是GT8当中默认的垃圾回收器对吧?哎,没有问题啊呃,那这呢,我们提到了他呢有一个搭配的哥们啊,在这个,诶新生代这块叫parallel,老年代这块呢叫parallel old啊这俩呢是哥俩啊搭配的。哎,所以说呢,这里边儿,哎,我们看一看啊。使用这个参数呢,咱们能够启用的是年轻代这个啊,Parallel这个JC,然后老年代这块呢,你就加一个old就行了啊,它俩呢可以互相激活啊,刚才那会儿也提到了,然后这个参数呢,刚才我们讲这个排钮的时候也提到了它俩,呃,它呢是来设置这个,呃,这个并行的垃圾回收器,呃,垃圾回收这个线程的这个个数的。
05:01
是吧,哎,这个个数的问题啊。好,然后下边这个max j c PS mill啊,你一看就能知道它设置这样最大的一个JC暂停的一个时间啊,单位呢,是这个毫秒啊,为了尽可能的把这个暂停时间控制在这个时间之内呢,诶我们垃圾回收器呢,会在工作室调整这个最大小啊或者其他一些参数。啊呃,这块呢,是来设置这个叫暂停时间的啊嗯,这呢,我们不得不要说一个事儿什么呢?这个parael它一个主要特点是什么呀,大家还记得吗。啊,我们说衡量一款这个垃圾回收器的主要指标,诶我们关注的一个呢,是不是叫并发量,哎吞吐量是吧?诶一个叫吞吐量,一个呢,是不是叫暂停时间或者叫响应时间啊,或者叫追求低延迟是吧,一个意思啊,那排出来的话呢,典型的特点呢,是不是它来追求的是叫吞吐量优先的。啊,吞吐量。啊吞吐量啊,记住它啊,这个我这块写了,别左耳得说,右耳得就出了啊,这左耳得进,右耳得出,这个power量呢,就是主打这个吞吐量啊,那要是主打吞吐量的话呢,你想想它的主要应用场景呢,是不是就针对这个服务器端,哎,咱们在服务器端的话呢,你想这个希望这个服务器的吞吐量要大一些,咱们用户端的话呢,是不是追求的是那个叫什么低延迟是吧?啊低延迟响应时间啊等等这个啊好,那既然它主打吞吐量的话呢,所以我们就不要在这个暂停时间那个方面呢,给它可啊要求太高啊,不要太过苛刻啊,所以一般的话,这个参数我们谨慎使用啊。
06:28
但然这里边呢,提到一个点就说呢,诶我们要是用它的话呢,它会尽量的把这个暂停时间控制在这个范围以内,那它会去调整我们这个对的大小,诶大家还记得咱们在前面讲这个内存的时候呢,是不是提到了关于这个咱们讲这个诶对空间的时候叫use adaptive size policy,诶默认情况下呢,这个参数呢,你看它是开启的,它会自动的是不是调整我们这个,呃,新生代里边的这个,呃,伊甸园区啊,跟我们这个survivval区的它的一个比例是吧?哎,就提到这样个参数了啊诶,OK啊,就是我们那个参数,因为默认的是开启的嘛,哎,它之所以能够哎自动的去控制啊,去调整这个内存的大小,就是因为我们那个参数啊,这块我也写了是吧?
07:09
呃,就是相当于把我们这个内存这块呢,设置成是一个自适应调节的啊,呃,就是当你不知道什么样的这个比例更好的情况下呢,你就开启这个自适应调节啊好。然后下边呢,有一个叫j c time raio啊g c time raio就垃圾回收的一个时间啊,占总时间的一个比重啊,这个呢,其实主要来衡量的就是这个吞吐量的一个问题了啊呃,它这有个公式就是我们这个呢设置的,你看这是一个非加号的啊,是一个非波尔类型k value6写的,最后的这个Y6呢,是一个数值,默认值呢是99啊99,你往这里边这放上99,这不是不是就1%啊。啊,那这个呢,当你设置比如说呢,你写的是个99的时候,相当于呢,就要求我们的垃圾回收这个时间啊,不能超过1%啊,不能超过1%,那如果你要这块呢,写上是一个这99啊,写上是一个多少19吧。哎,如果呢,把这个值设置成19,那这呢是不是就1/20啊,1/20呢,就5%呗,啊,那就要求我们这个垃圾回收的时间呢,不能超过5%。
08:06
啊,就这个意思啊,就这意思啊,那相当于你看他这个默认的这个情况呢,是不是垃圾回收的时间给的是不是比较小啊。啊,垃圾回收时间给它小,那相应的我们吞吐量是不是就可以更大一些,对吧?哎,OK啊。这个参数呢,跟咱们上面的参数它有一定的矛盾性啊,这呢就提到响应时间跟这个存储量的话呢,哎,它本身就是一个矛盾的对吧?哎,这个注意一下啊。好,这个呢,是我们说的这个事儿啊。嗯,然后的话呢,这个参数啊,刚才已经提到了啊,这就过了啊,这个是关于我们这叫parallel啊,主要呢,大家记住它吞储量优先,在我们服务器端的话呢,应用比较广啊,也是咱们JB8的一个默认的垃圾回收器啊。然后咱们看一看这个叫CMS啊,CMS的话呢,这个我们虽然说这个14中已经被干掉了,但还是要呃稍微的多说两句啊,因为在历史上呢,它还是比较重要的啊CMS的话呢,呃,从它开始咱们开始提到了一个词叫做什么呀,叫做并发。
09:03
哎,并发的意思呢,就是使得我们诶垃圾回收的这个线程啊,我写个T就是thread啊,跟我们这个用户的这个执行的这个线程啊,这两个线程呢,我们说可以是诶同时的去执行了,这个呢,就是我们提到这叫并发的一个概念,那能这样的话呢,诶给用户的体验呢,是不是就比较好,诶用户线程在执行,那同时呃垃圾回收线程在执行,这是我们用户线程也可以去执行,所以呢,给用户一个良好的一个用户体验,所以呢,跟用户交互的这样场景当中,诶我们推荐呢,是不是使用叫并发了。对吧,哎,就使用并发啊,跟用户强交互这种场景下啊啊,那这个CMS呢,是在JDK1.5的时候呢引入的啊也算是呃,House虚拟当中第一款真正意义上的这个并发的啊大圾回收器。啊,并发大一回收器啊好这呢,就是我们说到这个它啊。这个可惜的一个点是什么呢?你看这个CMS它呢,只能跟这个CJC搭配,哎,这是老年代的是吧,只能跟这个SJC搭配,跟这个panel搭配,它跟这个parael呢,还搭配不了,而这个parael的话呢,其实我们说是要更在这个吞吐量方面是更好一些是吧,它没办法跟他去搭配,只能跟这俩哥俩搭配,这哥俩的话呢,这哥们呢,是不是这个这个这有点这个性能太差了是吧,串行的嘛,哎很很难去,呃,针对我们现在硬件这个提升这种场景下呢,我们去这个更好的发挥这个硬件的一个性能是吧?诶所以呢,它呢就不太建议了,那这块呢,是不是只能跟这个penel去搭配了。
10:28
是这种啊啊这呢是我们要注意的一个点。行,那接下来的话呢,我们看一看它这个相关参数啊呃,使用一下我们这个CMS啊,这块呢,又是啊concurrent啊mark sweep啊JC,它使用的是标记清除算法啊,这个大家要小心一点。嗯,这是它,然后呢,这个有一个这样的一个参数还比较长,哎,设置,诶对上面这参数的话呢,你看哎,当你使用这个参数的话,它会自动把我们这个ta钮这个打开,那它俩呢,是搭配的嘛,是吧?诶然后那个老年代的话呢,它还用这个作为一个后备方案啊,刚才提到了,呃,这个呢,是设置这个堆内存使用率的一个阈值,达到这个阈我们就开始啊使用率CMS啊,进行垃圾回收,诶不同版本当中这个数值不太一样啊,后续版本呢,这个相对于是进行了一个提升啊。
11:13
这里边呢,提到一个点,就是说如果这个内存增长比较缓慢啊,那建议呢,我们这个值呢,就设置大一点,就是少让它发生这个CMS啊垃圾回收对吧?哎,就是降低这个CMS呢,触发这个频率啊,但是如果说你要是这个呃,老年代这个内存呢,这个增长率很高啊,这个这个这个增长率很快啊,这时候呢,我们就降低这个阈值。啊,就是可以让它稍微频繁的去进行这个CMS啊,避免的话呢,呃,你这个呢,如果说这个这个增长很快,然后呢,出现这个这个这个这个快要进行,就要进行这个垃圾回收的时候呢,这个内存占用已经很高了啊,要是一使用CS挂掉了啊,这时候要一挂掉,因为内存中这个碎片其实很多了啊,一旦挂掉的话呢,用老年代啊CO去替换啊,这个呢就很崩溃了。啊,这个我们要注意这样的一个阈值设置的一个经验啊呃,下边这块呢,就提到了说我们,呃,这个这个呢,这个跟这个是吧,涉及到的问题呢,就是我们由于CMS呢,使用的叫标记。
12:09
啊,标记这个我一说大家应该就很清楚啊,哎,标记呢叫清除算法啊,不是那个标记整理或者标记压缩算法啊,标记清除算法的一个问题呢,就是是不是有这个碎片化的一个问题是吧,那既然有碎片化的问题呢,我们就提到了说,哎,我是不是说要在执行完这个。For这些之后呢,对这个内存呢,进行这个压缩整理啊,就是降低这个碎片呗,对吧?啊那这呢就是表示呢,你开启的意思,开启呢就是指定在for这些之后呢,进行一个呃碎片的一个整理啊,但是这样的话呢,肯定会导致我们这个停顿时间呢就会更长。啊,毫无疑问对吧,嗯,这个呢,就是呃,你看它是一个非波尔型的,我们可以设置一个值,就是多少次这个for e之后呢,我们进行这个压缩整理啊,这挺好的是吧?啊这个啊,然后下边呢,就是parael CMS的一个thread啊,我们可以设置一个CMS呢,它的一个线程数啊,它的一个线程数,嗯,这个线程数的话呢,你看啊。
13:02
默认的时候呢,这个parallel j c thread加上一个三除一个四,这个呢,是咱们真正呃得到这个结果呢,呃是对应的咱们的,诶呃应该是这样说啊,这个呢,是咱们直接设置的这个CMS,这个呃并发的这个垃圾回收这个线程数,它这个数呢,跟我们这个啊变量呢是有关系的,咱们刚才上面提到了,是不是有这个parallel jc thread啊这个并行的时候呢,这个这个这个呃大击回收的线程,它跟这俩呢,这哥俩是有一个这样的一个对应关系。啊,有个默认关系啊,那你要是直接设置的话呢,那就以你设置这个为主啊这样子的啊啊这呢是关于这个CMS啊这块呢,我还罗列了他其他的一些这个补充的一些参数啊,补充的一些参数啊呃,具体到了就是我们涉及到比如说有一个重新标记的环节呀,对吧?啊还有呢,我们这个初始化标记的环节,哎当中啊,有的是还是默认开启的,嗯,这个呢,我就诶不一个一个的给大家再去详细的去说明了。啊,不再去详细说明,呃,再强调一点就是CMS呢,虽然说在这实当中被干掉已经被干掉了啊,但是现在的话呢,在很多的这个服务器端的这个应用当中啊,以及跟用户交互的这个场景下呢,它还算是一个比较闪亮的一颗新星啊,一颗明星啊,就是还有很多的场景下呢,也在用这个SCMS。
14:18
啊这呢,哎,相关的一些其他啊,使用频率稍微较这个低一点的这个哎这个这个这个参数啊这块哎可以来看一看,哎,然后呢,这里边这个特别说明就是我们提到了它,呃,这个残酷的这个现实是吧,如果呢,在JDK9当中啊,JK9呢说它就已经被标记为叫depreated了啊呃,你要是使用的话呢,也行,但是他会给你一个警告啊,在实际当中是彻底给大家已经干掉了啊,如果你非要用这块呢,它会给你出这样的一个哎红线的一个画。啊说open gdk它会忽略了你这样的一个设置啊,就是忽略你这个启用CMS这样一个设置啊,它已经被remove掉了啊,在10.0当中啊,那我们这个虚呢,就会使用默认的这个垃圾回收器,哎,就是这样的行为啊。
15:02
好,那关于这个CMS呢,我们就说到这儿,下边呢,说一下这个g first啊,这个E说到g first的话呢,这块呢,应该觉得诶很靠谱是吧,哎,这个我们就提到一个词呢,叫做区域啊分代化。啊,区域分代化是吧,哎,这呢,我们相当于把整个这个新生代老年代是不是分成成一个一个的region了啊然后哎有的region呢,表示的是新生代啊这个这个伊甸园区的,有的是survivor的,有的是这个具体的老年代的是吧?哎这样的一个情况啊,啊这是我们说的这个这first垃圾回收器,呃,为什么说又引入它呢?哎,其实呢,由于我们这个硬件啊,一个呢是像这个ACPU。哎,CPU的这个性能呢,是越来越高是吧,哎,这个也不断的去增加这个CPU的核心的一个数。呃,另外的话呢,就是我们这个内存啊,现在也越来越大。啊,那么基于这样的一个硬件场景呢,我们这个项目的话呢,像现在也分布式啊,啊这个微服务啊,这个我们针对互联网项目的话呢,这个高并发的这种场景也越来越多啊,跟用户交互的越来越频繁,那么我们基于硬件的这样的一个提升啊,基于业务的一个这个复杂化啊,我们这时候呢,要引入一个新款的垃圾回收器,那就是这first啊,这个也主打的属于叫低延迟。
16:13
啊,D延池跟我们这个CMS的话呢,其实算一样啊好,那这个g first这里边的话呢,我们看看相关的一些参数啊呃,使用这个g first啊就这样来写,很简单设置一下我们这个region的一个大小啊,默认的话呢,是这个把,就是我们会划分出来这个这个大约划分出来这个2048个这个区域啊,默认的话呢,属于占整个堆大小的这个两千分之一啊,每一个的范围呢,是一兆到32兆之间是吧,这样一个范围。下边呢,是设置这个最大的一个停顿时间。啊,期望的一个最大的停顿时间,哎,默认的是200毫秒啊,哎,这呢是parallel GC thread啊,我们刚才讲CMS的时候,包括这个parallel的时候,哎,是不是也提到了这个参数是吧?哎讲这个piel的时候,是不是也有这个参,哎,Piel。呃,钮啊,是不是也有这个参数是吧。
17:02
好,就这个啊,这个默认的最终的生成是八个啊,就是我们stop the stop the word是吧。呃,设置的这样一个,呃,就是叫什么暂停的啊,完全这个暂停下来以后的啊,并行去执行的这个JC的一个,呃,线程数啊呃concurr j c的一个thread,就是并发标记的一个线程数。啊,他跟我们上边这个呢,是不是有一个相关的一个关系啊。好,呃,下边这块呢,涉及到就是呃,触发并发JC的时候呢,Java堆的一个占用率的一个阈值啊,超过这个值我们就触发GC啊,刚才我们在CMS当中也看到是不是类似的这样的一个参数了啊。呃,然后下边呢,关于我们新生代啊,还有这个最大的新生代,它的占比啊是多少啊,它的一个设置情况。像咱们呢,呃,默认的时候呢,说新生代跟老年代我们说是1:2的关系是吧,相当于就百分之三十三点多啊,那这呢,我们还可以呢,专门去指定新生代和老年代的一个比例啊,那既然要指定这个参数了,是不是就不推荐大家再去用那个new raal了是吧?哎,去指定这个新一代老年代的比例了啊。
18:06
嗯,这个呢,设置这个保留的内存区域啊,防止我们这个two space呢去溢出啊,OK啊,这是它行啊这块呢,就是关于我们这个g first相关的一些这个参数啊,诶我这块又罗列出来关于这个叫mix jc啊,就我们进行混合回收的时候,诶,涉及到的一些额外的一些参数。啊,一些额外的一些参数啊,这个呢也是同样的啊,我就不详细的给大家这块呢去举例子了啊大家呢,在实际开发当中啊,首先呢,你把主要的这样的一些参数呢,你得清楚啊,它直接影响的就是我们这个回收的各个环节当中啊,一个线上的个数啊,暂停时间呀,对吧?哎,存储量啊哎等等这样的一些这个数据啊嗯,那其他的一些相关的根据你具体使用的这个JC啊,然后呢,你在实际开发当中,你再去做一些微调就行啊,当然这个调整它的前提呢,你得先看到一些日志文件啊,包括我们这个说大部文件啊等等一些这个数据的情况是吧?诶你再去做一些细节的调整啊。
19:02
好,嗯,这个呢,咱们说的这个j first,嗯,这里边呢,需要强调的点,刚才我们也看到了啊,就是建议大家呢,使用这个j first的话呢,就不要再去通过,呃,咱们说的那个什么呀,哎,杠XMN啊这个呢,咱们去设置,哎杠XMN哎我们就设置谁呀,哎设置我们这个,哎相关这个年龄代的一个大小是吧,包括呢,我们再去设置这个new ratio啊,新生代与这个老年代的一个比例的大小,呃,就不建议大家呢再去做这样的一个设置了。啊,这个大家注意一下啊,嗯,因为呢,你要是固定那样设置的话呢,它其实会影响我们是这个默认的一个暂停时间啊,这样的一个问题。啊,这样大家要注意一下啊,行,然后最后的话呢,我们,呃这个在讲上篇时候呢,其实提到过这个事儿,说该如何去选择垃圾回收器,呃这块呢,我们给到相应的一些这个选择的一些参考。啊OK啊,这个我就不过多的去说这个事儿了,就啊,那特别要说明的啊,就是跟语言一样啊,没有世界上没有最好的语言,那也没有最好的垃圾回收器啊,只有呢,适合于不同场景的这个垃圾回收器是吧?哎,这是我们要强调的一个点啊,那至于说未来那个JJC,那我们以后呢,再给大家展开来说啊。
20:13
好,那关于垃圾回收呢,回收器这一块呢,我们就给大家介绍到这儿。
我来说两句