00:00
接着呀,咱们来看一下这个parallel啊,这个scage垃圾回收器呢,它的一些参数的设置啊,这些参数设置的话呢,我们会发现呢,比之前的这个参数呢,会稍微的多一些啊,稍微的多一些啊行,那首先的话呢,这涉及到就是我们如何在程序当中显示的去指明,呃,咱们使用呢,叫parallel呢垃圾回收器,那针对于新生代呢,我们使用的叫usellel g c啊这呢就是手动的指定新生代的这个垃圾回收器了,然后呢,如果老年代的话呢,使用咱们就是use parallel old的GC就可以了,要加上一个old的这个单词指明我们这个老年代呢,使用的是这个。呃,并行的,咱们当前这个垃圾回收器。行,那这呢是我们说的这两个手动方式,然后的话呢,我们刚才呢,也提到过一个点说呢,在这个GDK8当中啊,咱们默认使用的就是诶这个parallel这个垃圾回收器,对吧?所以呢,我们会看到这样的这个场景啊,比如说当前咱们现在是在这个GDK诶八的这个环境当中,哎,GK8的环境当中,我们现在去做一个执行。
01:01
啊,首先呢,大家看一下当前的话,我们可以看到这块显示的是不是叫use parallel jc对吧,就是我们这块呢,启动的是这个并行的垃圾回收器,它是一个默认行为,然后以及呢,你看我们这个WIN2一下啊,打开这命令行啊接然后呢接INF。啊flag,呃,这块呢,你看我输入呢叫呃use啊para LA这个呢,我就没有必要去演示GC了,因为这块已经看到显示,显然的话呢,我们新生代已经使用的是这个并行的I回收器了,对吧,我说我这块呢,加上一个这个old。啊,然后针对的是咱们当前的这个,诶9820诶这样的一个进程,一会车,诶此时呢,大家会发现我们老年代呢,调的就是这个parallel o的这个JC。相当于呢,就是我们新生代,哎在GD8当中,新生代用的是它老年代呢,是加了一个parallel o哎这样的一组集合是吧?好这呢是我们说的这个问题啊,然后的话呢,我这时候显示的把它呢改成是九的这个环境。诶把这个位置我们也做一个调整。咱们知道呢,在这个JDK9当中啊,默认的这个垃圾回收器是不是就改为叫g first了。
02:08
那这时候你看我把这个程序抛起来,这时候已经显示的叫g first了,那在这种场景下,你看我们再做一个GPS是吧,然后呢,这块我们再做一个这样的执行,此时呢,当前的进程呢,变成了叫4164。啊,一回车那显示呢,这时候已经是一个,哎不存在的啊,就是这个减号呢,表示的就是我们没有使用这个垃圾,哎回收器的意思,那我把这个O呢去掉,那这呢也是一个减号。没问题对吧?行,那么在这个酒的环境当中啊,我们如果要想使用刚才说的parallel的话呢,你就需要呢,在这个位置,我们显示的给它去做一个设置啊啊这呢是一个加号叫para啊llel啊JC,你你看注意我这时呢,我只写了一个parallel这些,没有加那个parallel o的J些啊我光写了个它,然后呢做一个OK,把它呢再跑起来。啊,跑起来以后呢,这块它提示我,我应该是写错了是吧。
03:04
这个呢,我们是不是要加一个use,这个注意一下啊。嗯,可以了,那抛起来以后呢,在GDP9当中,你看现在呢,提示我们新生代呢,用的是parallel GC,好,那么在这个场景下呢,我们再去啊GPS一下先。嗯,然后呢,我们再把当前的这个是7984。诶把它呢抛起来,这时候呢,你看我们当前呢,咱们只是设置了一个新生代是吧,用的是这个parallel GC,但是呢,这个老年代的一个参数,我们一看,诶它呢,竟然也是一个加号。哎,通过这个呢,大家能理解我想要强调的问题吧。啊,虽然我这块我没有在这块去专门把它设置成是个old啊,诶你也可以大家下来去试一下,我把这块设置成是old的场景下,你看一下我们在命令行这块看不带old的,你看是不是一个加号,实际上呢,它也是,哎通过这个呢,我们想证明一个点是什么呢,咱们把这个填一下啊证明一点呢,就是说。
04:02
这两个参数呢,哎,当一个开启的时候,另一个呢,也会被开启。那我们可以把这呢七个词叫做哎互相激活啊,这个呢应该很好理解,就我们它俩呢是一组对吧,或者叫是一对啊你你设置这个参数,这个呢,老年代自动就用它了啊,老年代设置它以后呢,新生代呢自动就用它了,哎这呢就我们称为呢叫互相激活行,那这块我们把这个参数呢,也给大家在这做一个说明。啊,就是使用这个参数的话,我们可以,哎表明哎新生代,呃,使用这个我们叫parallel。哎,JC是吧,呃,然后对应的话呢,我们在这块补一个叫O。嗯,表明。那表明我们说这个,哎,老年代啊是使用。这这这。
05:05
哎,这样一个场景。保存一下是吧,好这呢,就我们说清楚了,关于这一组这个垃圾回收器的这样一个特点啊行,然后呢,我们再回过来看一下其他这个参数。这个parallel呢JCR啊,就是并行的垃圾回收器的这个线程的个数,对吧?这个呢,主要来设置这个线程的个数的,呃,这个线程个数的话呢,我们要强调一下就是最好啊,咱们跟CPU的这个数量呢是相等的,哎,首先说呢,比如我们举个例子啊,比如我们这个CPU呢,个数是八,那我们要设置成这个四呢还可以,那就意味着我们同时呢,可以有四个线程并行的去进行垃圾回收。诶,那我是不是可以再多一点呢,比如再多两再多两,那当然了,你这个并行的垃圾回收现场越多,是不是使得我们垃圾回收起来速度就更快,导致我们这个STW这个时间是不是就会变短一些啊,所以说呢,这个线程数多一点能好一些,对吧?那另外一个角度呢,就是说那我设置成十个行不行,在CPU是八的情况下呢,如果你设置成十,那就意味着我们实际上呢,会出现,因为你这个线程数多嘛,是不是我们要切换任务了,那一只要一切换任务,显然的这个效率反而是不是要降低了。
06:09
这个在咱们前面讲这个,诶zero和我们这个panel的时候,是不是提到过这个问题,对吧?诶这个大家应该不陌生啊。好,所以这块呢,我们说默认情况下呢,跟我们这个CPU个数相等啊,就挺好的。但是这块呢,细节来讲的话呢,我们说有这样的一个情况说呢,当我们的CPU个数小于八的时候,咱们的这个re,这个值呢,就是CPU的个数就是八,当然等于八的时候呢,也是八,当这个CPU的个数大于八的时候呢,我们这个数呢,就有一个公式了,举个例子,比如说呢,我们现在CPU呢是有12个。咱有12个CPU 12个CPU呢,12乘以五至60,这是60,然后60除以八的话呢,我们得上一个七七八五十六嘛,对吧?哎,七八五十六行,呃,就相当于结果是7.5,当然我们这块呢,要取下边这个值就是七了,所以三加上七的话呢,这个结果就是十。
07:00
那也就是说的话呢,咱们这个当CPU个数大于八的时候呢,咱们会有十个,哎垃圾回收线程的一个这个并行执行,哎,咱们没有说让他是12个能理解是吧,就说的话呢,你当CPU个数比较多的时候呢,我们还是要空出1.cpu呢,用于执行其他的一些任务的啊,哎,没有必要那么多了。行,这块呢,大家关注一下我们说的这个参数啊,然后接下来的话呢,我们看这样的一组参数啊,这有两个,一个呢叫max j c POS mill,就是最大的垃圾回收的一个暂停时间啊,这个呢,就是来设置暂停时间的,然后下边这个呢,叫jc time radio啊呃,Raio,那这个参数的话,就是垃圾回收这它的一个时间的一个比例啊,就是垃圾回收时间占总时间的一个比例,大家还记不记得咱们之前讲过这个参数是吧?啊,刚才提到呢,实际上是这个参数,就垃圾回收的这个时间占总时间的一个比例,它呢,其实跟我们这个吞吐量咱说是一个互补的概念。
08:01
互补的概念能理解是吧,诶他俩其实说的是一个事儿啊,也就是说呢,咱们当前谈的这个,呃,这些time raio呢,它其实跟咱们上面这个暂停时间,因为这两哥们呢,是此消彼长对吧,一个好了,另外一个呢,就参数会差一些,那他俩呢又是一个事儿,所以这两个呢,就是此消彼长的,那反应过来呢,就是咱们对应的这一组参数呗。嗯,就咱们对应的这一组参数是吧?呃,那大家知道呢,咱们这个parallel呢,这个caven这个垃圾回收器呢,它主要呢,是考虑这个吞吐量优先,那吞吐量呢,是不是主要呢,就由这个参数来设计吧。OK对吧,那另外这个呢,叫最大停顿时间,咱们也看一下啊,就是HTW这个时间单位呢是毫秒,为了尽可能的把这个停顿时间控制在指定的这个时间之内的,垃圾回收器呢,会调整这个堆的大小,或者是其他的一些参数的设置,那这个大家能明白对吧?嗯,那么对于这个用户来讲呢,停顿时间肯定越短越好啊,就是低延迟的嘛,你不能让用户感觉一卡一卡的是吧,也就是说呢,对于咱们这个客户端来讲呢,咱们比较看重的是这个停顿时间,但是对于这个服务器端来讲呢,咱们更多注重的是这个吞吐量。
09:10
哎,咱们希望呢,在相应的一个时间段之内呢,这个服务器端它执行的这个任务呢,完成的任务越多越好,诶对于服务器来讲呢,我们就是给他这样的一个指标是吧?诶所以说呢,这块我们呃这个parallel的话呢,它其实更多的适合于我们这个后台的这个场景啊去执行。那既然如此的话呢,建议大家呢,这个参数呢,就慎用。是吧,要慎用,因为呢,它俩是不是此消彼长啊,举个例子啊,比如说呢,我们要设置这个最大停顿时间是一毫秒。啊,一毫秒其实有点夸张了,我们整十毫秒,十毫秒其实也不算特别长啊,那如果我们要设成十毫秒的话呢,诶,那么垃圾回收的时候呢,它会尽可能想办法把时间呢,给我们控制在这个十毫秒以内,因为这块呢,是不是max哎,尽量控在十毫秒以内,它有可能控制失败啊,就是尽可能的往这块去压缩,那么呃,你想想我们要想能够使得这个垃圾回收这个时间比较短,就是你每次呢最大停顿时间很短,那怎么办啊,那么垃圾回收器呢,它就会调,想办法去调整,调整这个堆的大小,那么它尽量呢,就会调整这个堆啊要小一点。
10:17
如果你这块写成100呢,它这个堆呢就会大一些,因为你留给我这个SW的时间比较宽泛嘛,所以我这个堆空间呢就大一些啊你现在呢,这个给的这个时间特别短,我能想到的那就是哎我我觉得我实际上是这个GM是吧?哎拉力回流器的话呢,我们能想到就是说我把这个堆呢调整的小一点,那我小了以后呢,你每次JC的时候呢,时间是不是自然而然的就短一些了。没问题是吧,哎,那么大家呢,就能想到另外一个问题了,你这个对空间要小的话呢,哎,那么控制时间暂停时间呢是OK了,但是呢,是不是就会导致空间短,是不是我们时不时的就会报这个JC啊。也就会导致咱们这个JC的一个是频率会增高啊。频率呢,立马就高了,那频率要高的话呢,加上咱们每次时间啊,你做一个乘法,实际上呢,我们会发现最终的结果呢,就是咱们的这个啊叫什么吞吐量反而呢降低了。
11:12
哎,就是对应的咱们之前讲的这个图。来讲的这个图是吧,那你这个的话呢,属于这个叫吞吐量比较好的情况,现在呢,你非得把这个暂停时间呢,给它缩短,缩短成100毫秒,那缩短成100毫秒,导致我这个频率特别高,那加一起以后呢,呃,再除以我们这个总时间,反而呢,还不如我们这个场景好一些。哎,这就出现这样的一个矛盾的一个情况,对吧。哎,这个大家注意一下,所以这个参数呢,大家慎用啊,然后这个g c time raio的话呢,嗯,这呢,就我们衡量这个吞吐量的啊,默认值呢是99,那就比如说你把这个99往这一放,哎,这个结果呢,是不是就1%啊哎,那洋IG呢,就是咱们这个垃圾回收的这个时总时间啊你呃,垃圾回收这个时间啊,你不要超过总时间的1%啊,实际上这个数呢,已经比较低了啊,已经比较低了啊,那如果说我们这个数呢,设置成是19,那就是1/20啊,这个5%相当于你有5%的时间呢,可以用来这个垃圾回收啊,就相对来说宽泛一些是吧?哎,能理解这意思啊,行,那么这个矛盾性呢,咱们刚才也强调过了啊,这就过了啊,然后最后一个参数呢,这个叫呃,Use adaptive size policy说呢,是不是设置我们这个parallel呢,垃圾回收器呢,是一个叫自适应调节的策略,咱们在前面这块呢,是不是提到过这个自适应调节是吧。
12:29
嗯,再往上一个。诶,在这呢,提到这个自身性调节这个策略了,哎,不管在这提过,大家还有没有印象,我们在以前讲某个知识点的时候也提过这个策略。还记得吗?我简单说一下啊,咱们在当初讲这个堆空间的时候,是不是提到堆空间呢,涉及到这个叫新生代是吧?啊还有这个叫老年代,新老的一个默认比例呢,是不是叫1:2啊,然后这个新里边呢,咱们又涉及到呢,是不是叫伊甸园区,还有这个叫SURVIVVAL0区,SURVIVVAL1区他们的比例呢,是不是叫默认叫8:1:1对吧?哎,当时呢,我们发现呢,这个看这个参数啊,这个survivor这个raio的时候呢,确实是八,哎,但是的话呢,我们看这个真正分配这个内存呢,发现呢,更多的是不是叫6:1:1啊。
13:14
哎,当时我们还试图是把这个参数给它关掉是吧?哎,因为呢,默认情况下呢,咱们这个use adaptive size policy呢,它是开启状态的。啊,你比如说你看过来啊,我们把当前这个程序呢,咱们再给它抛起来。嗯,此时的话呢,你看咱们使用的是这个parallel GC啊,然后的话啊,我这时候呢,把这个参数先。在这啊做一个CTRLC,然后回到咱们这个命令行啊,GPS。啊,接一法。看flag。哎,粘贴一下当前的进程是2664。啊一回车,诶你看这种大家会发现我们这个参数呢,目前默认呢,是一个开启状态,也就是说呢,咱们正常情况下呢,就是你要使用这个power LA的话呢,我们会自动的在这个模式下,嗯去呃,设置我们的年轻贷一年去survive去这个比例,包括晋升的这个对象的一个年龄等等,它会有一个自动的调整。
14:11
啊,自动的一个调整,达到一个平衡,尽量的满足,是不是你设置的这个,呃叫什么,呃,吞吐量的问题,还有这个暂停时间的问题。啊,这呢是一个GM的一个自动的一个,诶这个调优的一个行为啊,当时呢,咱们讲了个呃,对空间的时候呢,说把这个参数关一下试试,结果关了以后发现也不好使是吧?哎当时咱们讲过哈,也就是说咱们在这个呃程序当中,如果你要显示的就让我们这个呃伊甸园区跟我们这个survival区就得是8:1:1的话呢,咱们当时呢,说你必须得设置那叫survival ratio是吧?哎,你把它改成是一个八。啊,写上这个坝就可以了,哎,这个大家注意一下啊,行,如果大家呢,刚才我讲的有点忘了,你翻一下咱们前面讲那个堆的那个视频啊就能知道了。嗯,这块呢,通过这个参数,咱们想强调的一个点呢,就是说,呃,我们这个parallel呢,这个垃圾回收器,它实际上是有一个自动调节功能的啊,然后尽可能的去满足啊,咱们在开发当中,咱们如果使用这个power LA的话呢,咱们通常会指定一个堆空间的一个大小,是吧?哎,然后呢,会指定这样的参数啊,当然你主要可以指定这个参数,指定完以后的话呢,诶,我们这个垃圾回收器呢,它会自动的,它有一个自动分配策略,达到你的一个目标。
15:22
哎,一般呢,咱们就不用主动去关了,除非呢,你自己很有经验,你说我不用这个系统它来调啊,我自己手动调呢,比它的效果可能还要好一点,那你可以考虑把这个改成是一个减号是吧,就可以了。嗯,这个咱们前面没有说过这个事儿是吧,CTRLC一下啊,就是这样,咱们再先把它关掉啊。咱们在这个位置呢,诶把这CTRLV一下,这呢就相当于是使用这个参数,如果你这块呢,改成个减号,哎,这个我们来OK一下,这个就相当于我们当前不使用这个,诶自适应的一个策略了,看这块有显示没。啊,这块好像没显示是吧,诶在这呢,在这你看是不是一个减号了,哎,如果你要在命令行那块显示呢,肯定这时候也就没有了,哎,就是GPS。
16:04
诶诶整错了啊,当前的进程9228啊,回撤一下,你看这时候就是减号就给它关闭掉了,行这呢就是我们说的这个parallel呢,这块涉及到这一共是几个参数。六个参数是吧,诶这块呢,大家关注一下,那如果说在面试当中问到了关于parallel呢,它的一些设置的参数都有哪些行为啊,这个呢,大家不用去死记硬背啊,你说我们这个名叫什么,你记不住这个我觉得很正常。啊,那你只要知道呢,就是它能够设置什么,至于说这个参数具体叫什么,这个你回头过来可以再去查就行,嗯,查的话呢,咱们之前呢,不是也稍微提过,在咱们这个GM呢,官方提供了一个列表。啊,这个列表你CTRLF一下,比如我们查一下这个啊。啊,这个JC是吧,那前面你可以再加上一个U。嗯,这个大写一个P啊行,这块呢,你看这不就指明了我们使用的这个参数嘛,诶关于这个参数的这个介绍,你看这都有,诶这块你看加一个old的话呢,这不就关于老年代使用它的一个说明嘛,就是我们这里边用到这个参数啊,大家都可以诶在我们这个文档当中啊,去做一个查找,诶看一下它这个相关的说明啊,就是你不用去死记硬背这个参数名,你只需要呢知道呢,我们这个垃圾回收器当中,它有哪些参数啊,可以用来做什么事,哎,这个我觉得更重要一些啊好,那么关于这个参数呢,咱们就说到这儿。
我来说两句