00:00
那接着啊,咱们看一下这个这个first垃圾回收器的一些相关参数的设置啊,这个参数的话呢,我一共是列了有六个啊,当然了,我们说还有其他的一些参数啊,大家呢,去百度一搜啊,你能搜到我们这个这first垃圾回收器当中我们可以使用的参数,对吧?诶是可以很多的啊,那这呢,我们主要呢,给大家分享这样的几个啊,算是比较重要的这个参数,首先的话呢,我们得能确定如何去使用这个g first垃圾回收器。那这块呢,我们想强调就是说在JDK9以后啊,我们就不用主动的去设置了,因为它是一个默认的对吧,那么如果呢,你使用你想在这个JDK8啊,或者在之前的版本当中,我们去使用这个j first垃圾回收器的话呢,这时候呢,你需要呢,显示的用上这个参数啊,又是G啊GCOK这呢不用多说了啊,咱们前面呢是讲这个。诶相关的我们设置的时候呢,实际上都有这样的一个经验了,诶我就不往这写了啊好这呢是这个事儿,然后第二的话呢,就是我们可以去设置一下这个堆空间当中,我们说呢,因为是用的这个叫region了,对吧?哎,可以设置这个region的一个size大小。
01:02
哎,可以设置它这个大小,它这个值啊,是二的一个次幂,范围呢,是从一兆呢到32兆之间,言外之意呢,就是说我们能够设置的值,这个大家你要注意啊,别乱写,就是你可以写一,一呢,可以写二是吧,还可以写四,要么写八,要么是16,要么是32,是不是就这样的一些数值啊。就是这些数值呢,正好对应的是我们二的零次幂,一直到二的五次幂嘛,对吧,还这样一个范围,那么一般情况下呢,我们把这个堆空间啊,会划分成刚才那会儿提到说这个几千个是吧,通常的话呢,我们都是这个2048个左右。当然这个个数的话么,我们实际上呢,也可以去有一些变化,但是通常情况下呢,我们都是这样的一个数量,那么这个数量基本上确定以后呢,我们这个大小呢,实际上呢,它是可以有一个变化的,对吧?哎,大小可以有个变化,那原IG呢,比如说我们如果呢,是一兆的话呢,一乘以二这个2048,那对应的实际上是不是就是两个G啊。哎,两个G对吧,那如果你要是32兆乘以这个2048呢,诶32兆乘以这个2048的话呢,对应的是不是就是64GB了。
02:04
对吧,那那对应的我们这个内存空间呢,你可以是两个G,一直到64个G,这呢是我们这个堆空间,哎这样一个情况,那如果说你这块设置的这个size呢,比如说比较小,Size设置的比较小,但是你整个这个堆空间呢,这个空间又比较大,那你这个一除的话呢,是不是我们这个个数呢,就会多一些了。哎,这个能理解是吧。行,这是这个问题啊,然后下一个呢,我们可以是呢叫max的呃,Jc PS mill,这呢也是我们说非常重要的一个参数,咱们呢,提到了说这个G1的话呢,它的呃一句话咱们来概括一下,它的目标呢,就是在可控制的一个最大停顿时间的基础之上呢,我们最大程度上是不是提高这个叫吞吐量,对吧?那么可控制的这个停顿时间我们怎么去设置啊,这块就提到了我们说max g CS mill,我们通过这个参数来进行设置。那我们说这个GM呢,它尽量的是吧,想尽一切办法,比如百分之九十九十五以上的概率呢,能够完成你这样一个时间。
03:00
那不能够保证100%达到这个默认值的话呢,是200毫秒,诶这个注意默认值呢是200毫秒,那这呢,从这个经验经验上呢,来给大家做一个分析哈,就是说我们这个垃圾回收过程,在你实现这个叫STW的这个时候,就是我们需要呢去停顿的这个时候呢,实际上呢,我们说这个嗯,几十毫秒到100毫秒,乃至说200~300毫秒呢,实际上呢,都还算是比较正常的。这毫秒啊,一不到一秒钟对吧?哎,相当于这是0.2的这个秒啊,这个都还算是比较正常的,那你想想,如果我们要是把这个值啊,你人为的给它设置的非常小,举个例子哈,比如说是20毫秒,那会是什么样的特点呢?会是什么特点呢?那咱们知道了这个堆空间是不是就是很多的这个region了,是吧?那你要是每次设置这个毫秒数非常小,那只能是不是让我们这个,呃,这first垃圾回收器只能是每次可挑的那个,咱们从那个价值从高往低排了以后呢,挑那个回收价值最高的region,咱们挑的个数是不是就比较少了。举个例子啊,比如说20毫秒我们只能挑俩,你要是200毫秒我们可以挑五个,每次呢回收五个十个啊都很正常,相当于你还是能够清理一定的空间的,你现在呢,每次就让它指这个最大停顿时间20毫秒,它就清理的这个呃,Region的个数啊就非常少,那如果说我们这块呢,在分配的这个用户进程,它占用的这个region的速度呢,又比较快,在咱们这块呢,回收的又比较少的情况下呢,最终的结果是不是我们这个内存使用率呢,就越来越高,越来越高,最后呢,诶就会出现这个占满,那一旦占满的话,我们是不是就for GC了。
04:29
啊一一放这些话,反而的话呢,看似呢,诶我们这个以为呢,说这个低延迟效果挺好,但最终效果的话呢,反而是这个性能呢下降了。哎,所以这个数值的话呢,大家也不要一味的把它设置的特别小是吧,这个要注意一下。啊就有点像这个,呃,大家呢,比如说这个在水里边扎着这个憋气一样啊,这个你这个每次呢,这个给的时间就是露出来这个时间特别短,那你这块再往下憋的时候呢,憋的时间也不会说那么长了啊蒸几次以后呢,这个你就持续不下去了,你要每次呢,这个你露出来水面这个时间长一点,这个你可以再下去,这个来来回回是不是,呃反复可以很长时间,你有可能这个呃二二十分钟是吧,可以持续20分钟,然后呢,每次露露头呢,是这个呼吸,咱们嗯嗯是两秒吧,是吧,两秒,你这块呢,整个0.2秒啊,刚一露头就得进去,那你可能持续五分钟,估计就就坚持不下去了啊,就有点像五分钟之后呢,咱们就要进行这个for jc一样是吧,哎,就这意思啊,下边呢,叫parallel呢j c thread,这parallel呢,我们说叫并行了是吧,因为呢,我们说这个j first垃圾回收器呢,它具有这个并行和并发的一个过程,那并行的时候呢,我们就会出现叫ITW,那在这个场景下呢,我们可以设置一下这个垃圾回收它这个线上的一个数值,说最终呢,这个设置的这个值。
05:44
它是个八啊,是个八啊,下边呢叫呃concurrent啊,就是我们在这个并发的环节当中,我们可以设置一下这个垃圾回收的这个线程的一个个数,那这个个数的话呢,通常我们设置的就不要跟上边这个一样那么大了,那这个呢,通常咱们可以设置成了是不是那占你上面这个并行的场景下的一个1/4啊。
06:04
哎,这个1/4是吧,哎,这个并行的这个工作的线程数,这个工作室的。哎,这个或者或者咱这样说吧,STW10这个JC线程的一个数量是吧,哎,这样子就更明确一下啊嗯,然后呢,下边这个呢,参数啊比较长,它来设置什么呢?它是设置这个触发并发JC周期的一个堆占用的一个,诶堆占用率的一个阈值。诶堆占用率的一个阈值,就我们后边呢,会讲这个垃圾回收呢,有周期性,它有三个环节,诶第一个呢,就称为呢,叫做MJC啊,或者我们也称为呢,叫做这个young jc啊,然后第二呢就是并发标记环节,第三个呢就是叫mix jc,就是叫混合回收,那么在这个周期当中,如果我们这个值呢,默认情况下呢是45,你要超过这个数值的时候呢,我们就要触发这个JC了啊像相应的这个参数,我们这里边列举的啊,大家呢,是不是都可以在我们这个诶参数列表中可以查到啊。
07:00
你看找到这个参数列表。诶,CTRLFCTRLV一下啊,这块我们就找到了啊。啊,Initially innoing是吧,这个初始化的这个,哎,它的触发的这样的一个percent,一个比例,所以呢,它可以设置一下我们这个对空间,它触发的这个呃,一个值啊,它是一个比例的值了,然后呢,它可以去开启一个并发的一个JC的一个周期,是就是我们后边要讲的这个回收的一个周期啊,那默认的情况下呢,它是一个45啊,你要是想设置成75%的话呢,你就这样来写,OK,这个呢,写的是比较清楚的哈,行,那么相关的一些参数呢,大家不清楚的都可以来我们这个参数列表这块呢去做一个查找。啊就行了,哎这呢,就是我们给大家要讲解的这样的一些参数啊,讲完这些参数以后的话呢,我们紧接着说这样个事儿,就是咱们常见的啊,如果你使用这个这first垃圾回收器的,它的一个步骤是什么样子的?说呢,这个g first呢,它的一个设计原则啊,是尽可能简化我们GM的性能的一个调优啊,只需要呢简单的三步设置就可以了,首先的话呢,我们确保呢,要开启j first垃圾回收器啊,你如果在GK8当中,你就加上这样一个参数使用呢,这叫J垃圾回收器,然后第二步的话呢,我们可以去设置叫堆的一个最大内存啊,咱们也都讲过啊,叉MMX叉MX是吧,是最大内存和初始内存,然后第三步呢,去设置最大的一个停顿时间啊,停顿时间刚才我们提到就是这样的参数来设置。
08:20
啊来设置,那一旦你设置好这个停顿时间之后啊,实际上剩下的这个事情呢,都可以交给我们Java逊尼呢,去自动的做一个调优,哎,包括这个region的大小对吧?哎,这个包括呢,我们前面提到这些默认的这个参数啊,它都可以自动的去做一个控制啊,那么下边的话呢,我们就会讲到说三种这个回收模式啊,叫young j c mix jc,包括呢,这个在比较糟糕的情况下呢,我们可能还会触发叫four j c。啊,这样的一个场景,行,那么关于这个参数的话呢,我们就说到这儿,整个这个参数的话呢,大家不需要死记硬背下来啊,你知道呢,就是我们如何去启动这个,呃,G1啊,或者叫g first这JC以及呢,我们设置这个region的大小,包括最大停顿时间,诶关键呢,就是这几个参数呢,大家主要呢去诶记住它是吧?诶剩下这个呢,你知道我们有这样的参数就可以了,至于说这个名字叫什么,你记不住的话呢,还可以去搜索一下是吧。
09:07
行,这呢,就我们说的这个j first这个参数设置。
我来说两句