00:00
下边咱们来看一下这个CMS呢,垃圾回收器呢,可以设置的一些参数,这个咱们已经知道了,这个后续呢,CMS呢已经不使用了,但是这块的话呢,毕竟哎在当初存在的这个场景下呢,它还是起到了很大的作用的,诶所以这块呢,我们也关注一下它的常用的这些参数,包括呢这个呃,现在大家如果去面试的时候呢,虽然说在GP14当中,我们已经已经把这个CMS呢给移除掉了,但是的话呢,这个很多面试的这个题啊,还都是比较老的题,还会出现呢,说关于CMS呢和g first这两个垃圾回收器呢,你做一个对比是吧,你给介绍介绍,所以这时候呢,需要大家呢,对这个CMS垃圾回收器的相关的一些特性啊,还得是要熟悉的啊,那这块呢,我们来看一下它内部的一些参数的设置。首先的话呢,就是首当其冲,我们如何在这个程序当中去使用CMS的垃圾回收器啊,这个稍微长一点啊,这个concurrent,所以你看这是前四个字母,然后mark sweep,这就是标记清除算法,对吧?诶所以呢,也相对来说比较好理解啊,它有一个呃小技巧,那通过这个参数的话呢,我们去指定呢,使用这个CMS啊垃圾回收器,这呢是针对于老年代,那一旦呢,我们老年代指定的是CMS以后呢,它自动的会把这个新生代或者叫这个年轻代呢,使用这个叫panel,哎,这个并行的垃圾回收器。
01:15
OK,那咱们这块呢,测试一下啊,打开这个程序,那首先呢,看一下我们当前这呢是咱们这块测试的时候呢,使用的是这个叫呃,Powerline啊,然后呢,我们这块呢叫use把它删掉啊,然后呢叫mark sweep啊JC是吧,都是大写的啊,这JC是大写,然后呢,我们做一个OK,注意你看这时候呢,我们并没有去设置啊,后边这个我们就不要了啊,并没有呢去设置这个新生代的这个垃圾回收器啊,设置完以后,注意我们这时候是在这个1.9的这个环境当中,我们呢先做一个执行。OK,那这就出来了,同时呢,一个警告啊,说我们这个来呢,这被depated了,嗯,那么往后走的话呢,你看你会看到呢,咱们在当前这个环境当中,这不是使用了叫CMS,然后同时的话呢,我们在新生代又使用了叫panel,哎,这个垃圾回收器。
02:04
没问题是吧,相当于呢,我们这个使用CMS的话呢,会自动的触发我们对排钮这样的一个新生代垃圾回收器的一个使用,这呢是我们在这个酒的环境当中,那如果说我们把它呢做一个调整,改成是这个八的场景。啊,这呢调整一下,然后在我们这个run的时候呢,这个咱们也改成是这个八。嗯,OK,行,改成八的这个场景以后呢,我们再去执行。诶大家看这时候呢,就没有我们这样的一个警告了,那这个数据的话呢,跟我们刚才看到呢,实际上是一样的。没问题是吧,所以呢,我们可以使用这样的一个指令啊,我把它呢粘过来啊,从这到这啊CTRLC这个我们在这呢,诶写明一下,诶这个指令的话呢,它表明这个老年代,呃使用这个CMS呢,这个JC哎说同时。哎,这个哎,同时这个新生代或者呢叫年轻代,哎会出发。
03:05
哎,出发哎对哎我哎这个对啊嗯,我们说叫的啊一个使用OK行,那这个事呢,我们就说清楚了,然后接下来的话呢,我们看下边这个参数,这个参数呢比较长,这呢是用于设置我们初始化的时候啊,你看这个也算是个初始化,就是初始化时,初始化的时候呢,我们在什么场景下呢,这个去进行垃圾回收。咱们前边的话呢,是不是提到过这样一个场景。那会儿讲的说由于的话呢,我们这个是一个并发的垃圾回收器,那你并发的时候呢,垃圾回收的线程和我们这个用户线程他们都可以同时执行,那这个同时执行的话呢,就使得我们内存空间你不能是现在不够的时候呢,才去垃圾回收,那这时候呢,用户线程一执行,万一整个的就移出怎么办呢?对吧?所以呢,我们必须呢,提前的进行一个垃圾回收,那么提前到什么时候呢?就是通过我们涉涉及到了这个参数呢,来进行一个设置,说呢,呃,通过这个参数呢,设置一个阈值,一旦达到这个阈值啊,咱们就开始进行垃圾回收。
04:06
那这里边有个默认的值说呢,在JDK5及以前的版本当中呢,是68%,达到68%的一个空间使用率的时候,老年代是吧,我们就进行垃圾回收,使用这个CMS,那如果说呢,呃,在这个JDK以后的版本中,我们呢,是达到92%呢,才会进行回收,你看这个数值呢,还变化挺大的啊。那这个变化的话呢,我们能看到什么样的场景呢?哎,下边呢,是我写了一个分析说呢,如果内存增长比较缓慢。诶,内存增长比较缓慢的话呢,就意味着我们这个用户线程,它不会一下子是不是把这个内存剩下的那些空间呢,就完全占了,对吧,所以呢,你要增长比较缓慢的时候呢,咱们就可以设置一个稍微大的一个值,比如说92%,那么这个大的阈值呢,就会使得咱们这个CMS呢,触发的频率是不是就要降低了。那一个呢,是每到92%的时候呢,你才去回收,一个呢,是到百分之六八呢去回收,那显然这个回收的频率是不是要更高一些。
05:01
啊,那回收频率是不是越少的话呢,我们这个程序的性能就会越好一点。啊,你少发生点JC肯定是更好的,对吧?诶反之的话呢,如果说应用程序这个内存的使用率啊,增长很快啊增长很快,那么你这个垃圾回收的线程又相对慢一些,那我们尽量的是不是把这个质量要降的低一些啊。对吧,降的低一些,因为用户线能增长很快,很有可能它会达到这个比较高的这个数值,那就说呢,直接就呃就挂掉了是吧,实现我们这个出现了这个CMS这个failure这个情况。啊,这时候我们不得不去调用这个,哎串行的垃圾回收器了,是吧?哎,就是说你增长很快的时候呢,咱们把这个阈值降低一点,避免呢,它会触发这个叫串行垃圾回收器啊总之呢,咱们的目的啊,就是要么呢是使用这个使得我们的应用程序的性能更高一点,要么呢,是不是避免呢,出现这个穿行垃圾回收器的调用,接着呢,降低我们这个forc出现的这个次数,对吧?哎,这呢是咱们的一个最终目的啊,行,那么另外的话呢,还有这样的几个参数啊,这几个参数里边这两个参数呢,它其实算是一个组合。
06:02
说使用这个CMS,这呢是一个压缩算法,在我们这个for jc的时候说用于指定啊,在执行完这个for GC以后啊,对内存空间进行一个压缩整理啊,以此呢避免内存碎片的一个产生啊,不过由于呢内存压缩整理呢,这个无法并发的执行,所以呢,我们这个停顿时间呢,就会变得更长一些啊,这呢是针对我们这一次CMS完了以后呢,你如果是需要呢,进行内存的一个整理的话呢,诶对于下一次CMS的话呢,中间这块的一个停顿。啊,一个停顿,注意这个呢,我们是一个加号啊,就意味着它呢,是表明你用还是不用,那如果你要是用的话呢,哎,那我们多少次for这C,我们就可以进行一次压缩整理啊,我们可以通过这个参数来进行设置,就是CMS啊for jc,然后before啊competing啊,就是在执行完多少次for jc之后呢,我们进行这个内存空间的一个整理,比如说你这个值呢,要赋能是个零。那就意味着我们每次呢,你CMS完了以后呢,都内存整理一下啊,你三呢,就是每三次以后啊,每三次for这次以后呢,我们进行一次这个内存的一个整理是吧?哎,咱们就相当于可以让这个内存呢,就是稍微的再规整规整啊碎片化呢就不要那么严重了。
07:13
哎,这个意思啊。行,那么下个参数呢叫parallel CMS呢,Service,它呢是来设置咱们CMS呢这个线程的一个数量,那CMS线程数量主要指的就是我们这个垃圾回收的这个线程。哎,垃圾回收这个线场,因为呢,我们是不是要跟这个用户现场一起,诶抢占这个CPU这个资源对吧?诶这个一起抢占这个CPU这个资源啊,默认情况下呢,我们那会儿也说到了,就是我们这个并行的啊,这个线程的这个个数加上三除以四,那它呢,其实默认情况下呢,就是我们CPU的一个个数。哎,CPU的一个个数啊,刚才那会提到,如果这个数是五的话呢,整个呢,我们是不是就有两个,哎,垃圾回收的线程啊。哎,这个注意一下啊,说当CPU资源紧张的时候啊,受到这个CMS呢,数据器线程的一个影响,那应用程序这个性能呢,就会显得稍微糟糕一点。
08:01
那因为呢,我们那会儿也提到过这个CMS呢,它是一个是不是对CPU资源比较敏感的啊,因为他要使用CPU资源,那同时呢,你又是一个并发的,是不是导致我们个呃用户线程呢,就相对少一些啊,那你这个吞吐量呢,就会相应的降低一些是吧?哎,这都是一系列的一个影响啊行,那这块呢,我们是介绍了这样的,哎,五个参数,那当然呢,呃,也是啊,你不用死记硬背把这个参数记下来,你只需要呢,记住我们在CMS当中有这样的参数设置。就跟说呢,大家说诶string string里边我想呢,获取这个某一个字符串啊,在它这个字符串当中出现的一个首次出现的位置啊,你知道呢,我们有一个那个方法啊,至于说那个方法名叫什么啊,你可能忘了,你找一下API就可以了啊,实际上呢,叫做index o是吧,但是你记不住,你知道呢,说里边肯定有这样方法,我觉得也是可以的。啊,就是这块呢,大家知道呢,里边有这样的这个参数啊,至于说这个参数叫什么呢,回头我们还可以呢,去这个,诶参数列表里边是不是可以去查呀,哎,这个是没有关系的啊好这呢就是我们CMS呢数据器的这个参数设置。
我来说两句