00:00
接下来啊,咱们看下一个垃圾回收器啊,这个呢我们叫piel垃圾回收器,这呢叫并行回收,诶前面一个呢,我们说的zero呢叫串行回收,所以它俩的主要区别呢,其实就是一个串行和一个呃并行的问题啊,就相当于呢C呢JC我们称为呢叫单线程的垃圾回收器,那么piel的话呢,我们就称为呢是C的一个多线程版本,我们在垃圾回收的时候呢,可以使用多个垃圾回收线程的诶同时的进行垃圾回收,所以呢是叫并行回收啊并行回收前面我们已经说过什么叫并行,什么叫并发了,对吧?这个呃P2的话,它就是parallel啊这个单词的一个缩写new呢就指的是我们适合呢来处理,这叫新声代啊梳理个过程当中,大家脑子里边浮现的还应该是我们这个图,诶这个拍扭的话呢,它适合处理的是新生代的垃圾回收,OK,行,那接着我们下看这个PI new呢收集器,它除了采用叫并行回收之外呢,哎,这里边呢说跟我们的power呃,S呢,它的垃圾回收器呢,几乎没有任何区别,哎,这里边我们想强调就是他们俩的话呢。
01:00
实际上呢,底层也共享了非常多的这个代码,诶共享了非常多的代码,主要呢,就是一个单线程,一个多线程的一个情况啊呃,它呢,在新生代这个年龄代当中呢,仍然采用的叫复制算法。啊,而且呢,也有这个叫stop the word这个机制啊,这个就是我们暂停用户线程这个机制,那由于的话呢,我们这个panel的话呢,它使用的是不是叫并行啊,就是我们有多条垃圾回收线程对吧?我们看这个图的话呢,就是这样子的,那所以说呢,它这个暂停的时间,应该说相较于我们这个单线程的版本来讲,它暂停的时间呢,是要稍微的短一点的啊这有这样一个特点,但是呢,也一定会暂停对吧,我们说任何一个垃圾回收器呢,都会有这个SCW这样的一个事件啊这样一个过程。那这个panel的话呢,我们说在很多GM呢,在server端,就是我们在服务器端的话呢,它是新生态的一个默认垃圾回收器,因为对于服务器端这个模式下呢,我们说这个CPU呢,它就不是像这个客户端一样是吧,它是一个单CPU的场景了,我们服务极端的这个硬件呢,呃,可能就更配置更高一些,那我们就适合呢,在这个多线程的场景下呢,去使用叫PA钮啊,性能会更好一些。
02:05
OK,那么这个图呢,我们就能看到,在这个新生代呢,我们就使用这叫panel呢去替换了叫zero,那么这个老年代的话呢,我们仍然可以使用叫zero old,所以这呢,实际上只是其中的一个搭配,那如果看这个图的话呢,我们会看到,当我们新生代选择用这个piel的时候呢,老年代呢,我们可以选用CMS或者呢叫SOLD,那使用这两个呢都可以注意这时候呢,咱们还没有说以这个JDK最新的这个版本来说的啊,你要说最新的版本的话呢,那就坏事了,因为在JDK9当中,这根线呢,已经被完全的被remove掉了,相当于我们老年代呢,这个对于pan来讲,老年代不能使用C的了,那么在这个JDK14的时候呢,说这个CMS呢也被移除了,那这根线呢,实际上已经没有了,那这时候就意味着我们这个潘是不是成了孤家寡人了。啊,就相当于我们说这个冰上的那个叫,就是冰上的那个比赛是吧,一男一女啊,这个你现在这个搭档的话呢,两个都都出事了,那现在呢,他也就退役了,就相当于我们这个盘景的话呢,现在也就失宠了,对吧?从这个角度来说呢,它就有点尴尬哈,就是他要说这个配置比较低的时候呢,我们用这个C,你要说呢,这个并行的场景呢,我们有parallel,它呢是用的另外一套JC的底层的框架了,对吧?呃,人家也有对应的叫parallel o啊,所以这块呢,我们完全呢就没有必要再去用这个panel了,它就比较尴尬啊,这样子行,大家知道这个事儿啊,那么我们不考虑这个最新版本的话呢,我们在这个老年代可以选择用CMS或者是叫SO的,那我这个图当中展现的。
03:30
看下边这个啊,展现的话呢,实际上是用的叫SOLD呃这样的方式,那由于我们这个新生代呢,咱们知道垃圾回收呢是极其频繁的,所以我们用这个并行的方式呢,会更高效,同时呢,这个STW这个时间呢也会更短一些,对吧?那么对于这个老年代的话呢,由于这个回收的次数也比较少,所以我们就使用这个串联的方式了啊这叫节省资源,当然同时呢,这个it tw,呃,这个回收一次呢,它这个时间呢,其实也相对来说比较长,本身呢,这个标记整理这个算法呢,是不是?呃,从三个回收算法上来讲,它是不是也是效率比较差一个,对吧,因为涉及到一个内存的一个碎片整理啊,这个大家稍微注意一下啊,好,那么还取咱们说这个,嗯,在餐厅的这个例子的话呢,这就相当于是这个呃,顾客呢在这吃饭,然后呢,我们刚才说呢,要这个餐厅消毒,那之前的话呢,我们是有一个服务员呢来消毒,现在呢,就是多个乘员呢,同时呃多个这个服务员同时呢来去消毒,所以呢,这个效率呢,是不是就更快一些。
04:26
啊,消完毒以后呢,这个客顾客呢,还可以接着吃饭是吧,这样一个场景啊好,然后呢,我们看下边这个介绍说由于呢,这个penel的收益器是基于并行的,那么是否可以断定呢,说penel收据器呢,诶在任何的场景下的回收效率都比这个Siri呢要更高。啊,这个问题呢,既然问出来,显然呢它就不是一定的了,因为要一定的话呢,一般大家可能都默认的会选择是,所以呢,那就没必要讲了,是吧,这是一个逆向思维哈,呃,那怎么来解决这个问题呢?我们说呀,在这个多CPU啊,就是多可以允许有多个线程同时运行这样的场景的话呢,我们要充分利用这个多CPU的它的这样的一些硬件资源,所以我们可以考虑用这个排钮啊,比如我们有四个CPU。
05:09
哎,准确说应该是四个核对吧,四个核心的话呢,我们是不是就可以考虑开四个线程,然后四个垃圾回收线程呢,并行的是不是去回收垃圾啊,哎,我们这个性能肯定比用这个C呢要更好一些,但是的话呢,如果我们是单吸收这个场景。单CPU场景呢,意味着我们实际上同一个时刻是不是只能有一个线程去执行啊,对吧?诶那么在这种场景下呢,我们是不是就使用这个叫zero呢,要更好一点啊,因为我们就一个垃圾回收线程,你要用这个拍镜的话呢,我们起四个线程,那这四个线程是不是他们之间还相互去争抢这个CPU资源啊,CPU来回一起切换,那切换呢,是不是也需要花时间,反而呢,会有一些额外的开销,对吧?诶这个大家注意一下啊,也就是单CU场景下的话,我们C呢,反而呢,它的效率要更高一些,嗯,行,那么除了这个息肉之外呢,我们说目前啊panel这些它还可以跟cml来CMS呢,垃圾回收进呢做一个配合使用,就是刚才我们说到的这样一个图。
06:04
诶收到这样一个图,哎这就可以了,行,那么这呢是我们说关于这个哎pen钮这个垃圾回收器的一个介绍,然后下面呢,就关于这个参数配置啊,这个呢,诶我们先简单说明一下,咱们可以使用呢叫use pen钮JC啊去启动我们新生代呢叫pen钮的垃圾回收器,然后呢,因为呢,你是一个并行的垃圾回收器啊,我们可以指定呢垃圾回收这个线程数。我们这个参数呢,叫parallel j c th。呃,限制这个,呃,线程的一个数量,默认的话呢,跟我们CPU呢,这个数目呢是相同的,那CPU默认相同的,大家可以呢,改的小一点,比如说我们CU呢,现在是一个八核的CPU,你可以改成四个对吧?但是建议呢,大家是不是不要超过我们这个CPU本身的核数啊,你说我这个八个CPU非得改成12个这个线程数,那你这时候呢,多个线程之间是不是要涉及到抢同一个CPU同一个核了,这块呢,又得有额外开销是吧?所以大家呢,如果设置的话呢,不要超过咱们这个CPU的个数。
07:01
啊,那又因为呢,就是嗯,咱们呢,这个在不超过的情况下呢,我们是不是越多一点是要更好一些啊,所以默认呢,跟CPU这个数目相同就挺好的,所以一般呢,咱们可以不去设置它了,但你要注意呢,就是我们可以去修改的,对吧?诶给我们这样参数咱们可以修改,行,那先做一个这样的介绍啊。
我来说两句