00:00
接下来啊,咱们就一个一个来讲一讲这些垃圾回收器,那首先第一个呢,叫serreal垃圾回收器,那这儿呢,我们一个词来概括呢,叫做川音回收啊,那一提到这个sre呢,它这个单词本身的意思啊,就叫做串行,所以这块呢,我们也算是呢,叫建鸣之意是吧?哎,通过这名字呢,我们就能很好的判断了,它就是单个线程的一个回收啊,方式说Sri呢,射击器,它是最基本的历史最悠久的垃圾回收器了。那在这个1.3之前啊,我们是新生代的唯一的选择,后来呢,我们说有了一个panel,就是并行的一个版本,OK,那这个SIR6呢,收集器,它是作为我们houseport虚拟机当中,在这个客户端啊,就client这个模式下,默认的新能代的垃圾回收器,因为我们通常客户端的话呢,这个性能呢,都不是这个硬件配置啊,都不是特别高是吧,咱们也知道呢,在早期的这个GDK这个版本当中啊,那个年代呢,这个硬件呢,还没有说像咱们今天一样,处于这种井喷式的一个发展,对吧?所以说呢,在这个,呃。单CPU的这种场景下呢,我们使用这个C垃圾回收器的话呢,它还是这个具有不错的这个性能的啊,这个大家稍微关注一下。
01:05
啊,你像我那个,呃,九几年上初中的时候呢,买的那个电脑,那就是单核的CPU,那个时候呢,嗯,根本就没有想过说CPU还可以多核是吧,因为那时候一说CPU呢,通常说就相当于人的大脑或者叫人的心脏一样,因为大家谁想过说一个人还可以有两个大脑或者说两个心脏呢,所以呢,就认为都是单核的,那后来呢,上大学的时候啊,突然说说诶电脑还可以双核,当然一下子感觉很诧异,当然现在的话呢,大家一说到双核啊,四核八核一点儿也不陌生是吧,当是当时那个年代的话呢,我们说在单核的场景下呢,C呢,也是我们唯一的一个选择,OK,那么C呢,这个收集器呢,它是使用叫这个大家需要记住它,它呢是针对我们说叫新生代,那新生代的话呢,咱们前面讲这个分代收集算法的时候,也提到过,针对新生代啊,我们说这个叫什么survivor,邻区一区咱们用的是这个复制算法,对吧?那所以这呢也是自然而然呢,就用的复制算法,然后呢这个串行回收啊,然后呢,有这个stop word一个机制。
02:02
那stop word就是我们在进行垃圾回收的时候呢,需要把用户现场呢,完全给它停掉,这个注意。行,然后呢,除了在这个年龄带之外呢,我们说这个zero呢,垃圾回收器,它还针对于这个老年代呢,提供了一个叫zero old,那这个咱们在前面是不是也提到过啊,Zero和zero o,这是它俩是一个这样的搭配的一个环节。OK啊行,那这个C的话呢,它呃采用的也是传音回收,看名字也知道,然后呢,它也有这个stop word一个机制。嗯,然后他使用这个算法的话呢,我们前面讲分代收集算法也提到过,针对于老年代的话呢,我们说不适合用这个复制算法了,因为老年代我们说这个他通常呢,不像新生代一样是招生夕死的,那你要说大量的去复制呢,这个成本还是很高的,对吧?而且呢,我们老年代呢,空间比较大,你复制算法呢,需要两倍的内存空间,需要有时是空着的,这有点浪费了,所以针对我们这个,呃,老年代的话呢,这里边我们用的叫标记压缩算法,前面咱们都讲过,那这个标记压缩算法的话,呃,压缩算法的话呢,我们说它也会在这个算法的结束的时候,是不是对我们这个内存进行一个整理,防止有个碎片化的问题,对吧?诶,我们可以使用这个叫是不是叫指针碰撞的方式呢,去分配新的对象啊。
03:09
哎,这个咱们前面都讲过啊,然后这个COO的话呢,它是运营在这个C模式下,默认的老年代的一个垃圾回收器。哎,默认的老年代优惠周期,那也就是说的话呢,当我们新生代这块呢,你使用的这个zero的时候呢,有老年代,我们实际上呢,诶就可以指定呢,用这个SOLD了。诶就可以使用这叫CO啊,注意这是我们说的这个情况,然后呢,这个CO的话呢,在这个server模式下,就是我们所谓的这个服务器端模式下,它呢主要有两个用途,那这个呢,主要体现的其实就是我们上面这图就这图啊,咱们这图呢,稍微的再给它盯一下,截个图啊再过来。哎,在这看啊,说这个在服务器端呢,它主要有两个用途,第一个呢,它是与这个新生代啊,新生代里边我们提到叫parallel是吧,Scaven啊跟这个蓝一会中心来做一个配合使用,那另外呢,它还作为我们这个呃老年代啊这呢提到啊不是啊,对老年代这个CMS它的一个呃后备方案。
04:02
那其实你从这个图当中去看的话呢,这个C的话其实还挺受欢迎的是吧。啊,就像像个交际花一样啊,他俩你看基本上除了跟那个para来O,因为他俩呢就是一个串行,一个是并行的概念,它俩就别带大线了啊,除了他俩之外呢,你看跟其他这个是不是多少都有这个大线是吧?CMS呢,把它作为一个后备方案,然后呢,有zero啊,有panel啊,有这个parallel啊,都有,只不过呢,在后边的话呢,这个八当中,把这个呢是deer了,然后这个呢,在我们这个十当中也做了一个移除。啊,有这样的一个区别是吧,那现在的话呢,这个你看比较单纯的这个zero的话呢,它其实就是跟我们这个zero zeroo的呢,跟我们这个新生代的这个zero呢进行一个搭配,那CMS的话在JD14呢也被删掉了,所以说这根线其实也就后来就不存在了是吧?哎,它呢就是主要呢跟我们这个S呢做一个搭配,这个呢一说大家就能清楚。好这呢就说完了啊,然后呢,我们从这个图示上来看的话呢,就是这样个图,这个新生代这块。
05:00
哎,新生态这块呢,我们使用的是复制算法,是单线程的啊zero,然后老年代这块呢,是标记,呃压缩或者叫标记整理算法啊,这个呢也是一个单线程的啊,他们俩呢都需要呢,是不是stop the word呀,然后前面我们是不是也讲过这个安全点的问题,对吧?那只有呢,到安全点这块呢,用户线上才可以听下来啊,还提过一个叫安全区域的问题,对吧?诶大家诶忘了,可以稍微前面复习一下啊。刚才我们这里边提到了一个单线程的收集器,这里边这个单线程的意义啊,我们说有两个方面,第一个的话呢,就是它只使用一个CPU,或者要一个收集线程,我们去完成垃圾的一个收集工作,但是就是单线程串行的一个意思,那另外一个呢,重要的含义呢,是说我们呢,在这个垃圾回收的过程当中,大家会看到我们的用户线程呢。哎,是不是完全处于一个叫stop the world的一个状态啊。哎,就是完全呢去暂停其他所有的工作线程,诶这个大家要注意一下啊,啊在咱们这个单CU的场景下,我们可以使用这个C轴,在这个多C的场景下呢,也可以你设定为这个吸收,当然一般呢,我们不会这样设定,效率肯定不高,对吧?当然呢,我们是可以设定的,哎,这个大家注意一下。
06:06
哎,这个大家注意一下,行,这呢是我们说的这个问题,然后接着我们再往后看说呢,我们这个C呢,垃圾回收器,它的一个优势是什么。诶还有优势呢是吧?诶我们说既然没有把这个C和C的呢,把这一堆组合给它删除掉,那说明呢,他们还是有各自的应用场景,行,那我们看一下这个C呢,回收器它的优势呢,就是简单而高效,哇,它竟然还高效是吧?诶这个高效呢,当然我们指的呢,是针对于我们其他的收集器,在这种单线程的场景下啊,我们C呢还是高效的,因为它是不是节省了那个切换CPU的时候的那个时间了,对吧?诶这个大家注意一下啊。行呃,如果呢,你是限定在三个这个CPU的环境当中,我们CE呢,没有额外的一个现成的开销,专门呢,专心的做这个垃圾收集,所以呢,它可以获得更高的收集效率啊,就跟我们说一个人一样,你就一心一意啊,是不是那踏踏实实的就做这一个事儿啊,精打细磨把这个事做好的,那就非常不容易了。
07:04
那这呢,就是我们这个C,你要说干点那个,再干点那个,你中间在切换的时候呢,是不是也需要花一点时间,呃,那这个性能的话呢,就呃没有办法跟我们这个C呢,在单性能场景下的这个诶做比较了啊,这个会更好一些,那说运用在这个client模式下呢,它是一个不错的选择啊,这个很好理解啊行,那么下边提到说在用户的桌面应用场景当中啊,说呢可用内存啊,一般不大几十兆啊,或者一两百兆啊,这样个场景下,然后回收这个垃圾的话呢,诶几十毫秒或者这100多毫秒,在这个较短的时间内呢,你只要能够回收啊就可以了,发生的频率呢,哎,也不是特别高,这时我们用这个串行呢,还是比较不错的。啊是比较不错的,OK,这个呢,大家能够,呃,根据我这的其中一个场景呢,诶你去衡量一下啊,去衡量一下就可以了,行,然后下边的话呢,提到了我们如何在这个程序当中去指定使用,这叫zero j c,那这个呢,咱们等下给大家举个例子,行,那前面这块的话呢,我们就基本上能够说清楚,咱们关于这个zero和zero old的这样的一些场景,关于这个图呢,大家去记一下。
08:05
诶可以去记一下啊,咱们如果举一个生活中的场景的话呢,就好比是大家去这个餐厅吃饭啊,餐厅吃饭,然后呢,比如说特殊时期,现在餐厅是不是要做消毒啊,这个用户现场就好比是每一桌这个吃饭的这个客户,然后现在呢,说我要消毒了,是我们让这个所有的这个吃饭的这些这个顾客是吧,你现大家都停下来,呃,现在呢,这个呃只有一个啊餐厅服务员他现在要消毒,他消完毒以后呢,大家就接着再吃饭啊,这块又是消毒,所以它是一个单线程的。啊,这是其一,其次的话呢,它会stop the work是吧,他在消毒的过程当中,大家谁也别吃饭了,哎,就这样一个情况,OK啊,先了解一下这个问题啊,行,然后接下来的话呢,我们给大家呢,诶,通过这个具体的代码形式呢,给大家去演示一下我们如何在程序当中去使用这个啊,创新回收的垃圾回收器。
我来说两句