00:00
那么在讲完我们这个g first垃圾回收器之后啊,咱们整个啊,要给大家介绍的叫经典的垃圾回收器呢,就算是告一段落了,那我们这儿呢,做一个整体的总结,呃,大家回忆一下,咱们之前呢,是不是已经一共讲过了,叫七款垃圾回收器,对吧?所谓的经典的话呢,就是我们已经经过这个呃商用的一个检验了啊,我们都可以去正常去使用的,那么相对应的呢,就是我们在JDK这个11的时候啊,推出的像这个JJC,像这个1C龙JC,像这个神圳JC啊像这些垃圾回收器的话呢,他们都还是一个叫啊experimental就是一个试验性的一个标识,就是还没有真正的引入到我们这个JDK当中,那所以我们前边的呢,就称为叫经典,那目前呢,我们使用的呢,更多的是这个g first在我们这个垃圾回收器当中的,对吧?诶是这样的场景,但是并不意味着我们其他垃圾回收器呢,都不会用啊,还是会使用的,那我们就根据具体的场景呢来去决定是吧,那首先的话呢,我们对之前已经讲。
01:01
过的这七种垃圾回收器呢,做一个简单的一个梳理这块的话呢,我就做成了一个叫Excel的一个表格。我觉得这个表格呢,就非常的清晰,那大家呢,看到这个图的之后呢,你可以及时的截个图,把这个图呢保存一下。对吧?哎,如果你是公立点讲,去面试的时候呢,我觉得你可以把这个呢,提前呢背一背啊提前背一背,那涉及到这个分类的话呢,这不用多啰嗦了,对吧,那主要呢,你看我们这里边这个g first,咱们刚才呢,是不是也提到过说这个g first呢,它还是设置成是一个叫并行的一个垃圾回收这个环节,对吧?但是在他这个标记的时候呢,我们就出现过叫并发的一个标记,所以呢,我这块叫并发并行,它实际上都存在这样的概念,咱们在一开始讲这个g first它的一个优势或者特点的时候呢,也提到过这个并发与并行,OK。然后这个作用的位置,我觉得大家一般情况下啊,你应该整不混这个大家看这个图呢,可能更清晰对吧,一般这个呢不会出问题,那使用这个算法的话呢,这个呢,实际上也非常好记,只要呢是这个新生代都是复制算法,老年代这块的话呢,哎,那就是标记清除和标记整理,或者叫标记压缩,对吧?那么只有我们这个CMS呢,它是叫标记清除,那剩下这块呢,是不是就标记的,呃,标记压缩呗。
02:11
对吧,所以这个呢,呃也比较好去记忆,那对于我们这个这份的话呢,咱们前面讲它这个呃特点的时候呢,不也提到了,它是标记压缩和复制算法呢,共同来起作用,每一个region呢,他们在回收的时候呢,是复制算法,但整体上呢,我们又是一个压缩算法。啊,标记压缩算法OK,那那这个特点这个呢,不用多啰嗦了。不多啰嗦是吧。行,这呢是我们说的这个特点,然后适用场景的话呢,呃,这个呢,大家可以稍微在这块看一看啊,稍微看一看,像这个串行呢,肯定是这个,呃,单CPU的是吧,可兰模式的这个毫无疑问的,然后并行的这种呢,肯定是针对我们这个,呃,这个并行,并行的话呢,你看这个没有明确的指出啊,这个呢,主要是跟我们这个CMS呢去配合的,只要是并行的话呢,那我们一定是这个多CPU的场景呢,肯定会更好一些,所以默认情况下呢,其实就类似于这个server端。
03:02
啊,那如果呢,你要又关注于这个叫吞吐量的话呢,那肯定就是后台运行了是吧,这个server端我们说服务器端更合适一些,那么如果凡是提到这个响应速度这块呢,那一定是跟我们用户交互比较多的场景下,我们关注这个叫响应的一个速度。对吧,诶关注这个响应的速度OK,行,那这呢,我们就在不多在这个表这这块呢,我们花这个时间了啊行,那么接下来的话呢,我们这块呢,你看指出来就是我们这次的一个发展路径,先是一个串行,然后呢是一个并行,然后呢是这个并发的CMS主打这个电延迟,然后后来我们说就在指定的这个限定的这个暂停时间范围之内呢,我们尽量的去提高这个吞吐量,就是希望呢,能够把他们呢有机的结合起来,以及呢,我们到后期更关注的这个低延迟是吧,我们再延迟一步,能不能并发的去执行,跟用户现场在回收的回收垃圾的时候,这常提到叫ZJC对吧。好,那么这个图呢,咱们在一开始讲这个七种垃圾回收器的时候呢,带着大家看过啊,因为我希望呢,大家在一开始的时候呢,就有一个大局观,对吧,我们讲哪个讲到哪儿了,还有什么什么怎么搭配的啊,一开始呢就心里有数,那如果刚开始的时候大家没有去截这个图的话呢,那么下面呢,你把这个图呢也截一下对吧?哎,这个图呢,是针对于咱们最新的这个JDK版本啊,这样的一个结构啊,JDK7跟八,这个扎尔逊尼在JDK7跟八之后啊,所有的收集器组合的一个连线,那实际上呢,这块我们已经更新到了这块,在这标明一下啊。
04:34
哎,就是咱们下边这个图呢,实际上是更新到了最新的这个JDK14啊。这个我们稍微的再把这个历史呢,简单的给大家再复习一下,凡是这里边不管是实线也好,虚线也好,大家呢全部都给它连接起来,这个呢是实际上针对的是我们这个JDK,诶咱们可以理解成先教七吧,诶在JDK7当中,反正这个连线呢,就都能够去使用这个g first呢,它就自己玩是吧,诶新生代老年代他就自己全干了。
05:05
然后的话呢,我们说在这个JDK8当中提到了一个是这个红线,还有这个红线呢,被depreated了,就是标记为呢,是一个叫叫什么呀,叫废弃了是吧?但是这个废弃的话呢,我们说de k的这个结构呢,仍然是可以使用的啊,这个大家注意一下,然后在我们这个JDK9的时候,JDK9的时候呢,是把这根线跟这根线呢,就完全的给干掉了。就完全不要这两根线了,也就是呢,我们再想使用就不行了,因为它做了一个叫remove是吧?啊就完全的是一个移除,好这呢是我们说的这个意思啊,然后的话呢,我们再来提一下,就是我们这个,呃,我这标CMS这个框,这个框的话呢,是在JDK9的时候呢,被depre了。然后在GDK14的时候花的时间还挺长,在JDK14的时候呢,做了一个。Remove就是CMS呢,不要了,这就是这个在这个三月份的时候是吧,刚过去没多久啊,咱们现在是这个五月份,这个三月份的时候呢,就已经给他干掉了啊remove掉OK,这呢是关于它,然后这根线呢,在咱们这个JDK这个14当中给他们做了一个叫DEP。
06:11
那做了一个de能理解是吧?行,那么呃,未来的版本中肯定是把这根线呢,也会断掉吧,毫无疑问是吧?行,那如果我们把这个线呢,都给它擦出以后,乃至于说呢,你把这个CMS呢,也给它出以后,大家看看我们还剩什么。还剩什么呢?诶这根线是不是有啊,那我们这个zero j c跟我们这个CO的JC相当于呢,就是你在这个客户端这个client模式下,或者呢,单C的模式下,就是我们一些这个嵌入式的一些设备,它这个硬件的水平比较低的时候,我们是不是还可以使用叫S对吧?哎,这样一个串行的结构会使用。那然后的话呢,我们这个parallel和parallel old啊这个呢,会被使用在咱们JDK8当中,咱们默认的就是这样的一组组合。啊,那主要的是不是就剩这根线还有这根线了,然后呢,诶我们也可以使用它叫这first。
07:02
对吧,哎,这个结构呢,就更加的明朗,哎,就更加的明朗,OK行,这呢,就是我们说可见的是一个比较复杂的结构,然后呢,刚才这个迭代的过程呢,大家应该也听听清楚了啊,然后稍微的自己呢也记一记。啊,这呢,就我呃在这个图当中描绘的这些文字啊行,那接下来的话呢,我们说这个怎么去选择这个垃圾回收器呢?啊,咱们还基于比较全的一个场景下,我们如何去选择呢?啊,这个垃圾回收器的一个选择呢,其实对于我们优化来说呢,应该是非常重要的一个过程。啊,就是基于我们目前讲的这个知识,就是咱们这个上频对吧?哎,这个咱们再看一下啊,基于咱们这个上篇讲的内容话,我们来说一下,就是后边呢,我们要讲这个性能监控与调优,那么我们这个上品呢,实际上是花的这个精力比较多的中篇下边呢,相对来说这个咱们视频时间上就不会这么长了,那么上面给我们的启示意义呢,其实主要呢,一方面是针对于我们前面讲的这个内存结构上。我们呢,如何去分配这个,尤其是存在垃圾回收的这个堆空间和这个方法区,对吧,如何呢去更好的去设置参数,然后使得这个呃堆空间方法区呢,能够充分的去做利用啊这呢减少这个JC是吧?啊这是我们内存的一个启示。
08:14
然后后边这块给我们的启示呢,并不是说我们在算法上大家去做什么发挥啊,你去优化优化算法,这个不是你干的事儿了,或者说呢,诶是个别人呢要干的事儿,在这个真正比如说像国内的像淘宝对吧?哎,你在这个阿里巴巴这个体系里边,它有自己的叫淘宝GVM,你去优化它底层的算法,针对人家这个具体的业务场景啊,这是有可能的啊,这没问题啊,当然对于绝大部分人来讲呢,我们在生产环境当中,更多大家关注的就是你要正确的是不是选择相应的这个垃圾回收器啊啊,你要选择不合适的话呢,一定会拖累你这个业务的一个执行的。OK啊,那回过来,那既然呢,垃圾回收机的选择非常重要,那我们该如何去选择呢?诶这块呢,我简单的给一些相关的一些指标,好大家看一下这个我们优先的话呢,是让我们这个GM啊自动的去完成一个呃,这个调配啊,自动的去适应,包括呃去去去调整,包括这个内存对吧,它自适应的,呃这个一般呢是都不会太差,你要说多好呢,不一定,当然一定呢不会太差。
09:13
啊,你要自己呢去找,那有可能还整的比较糟糕是吧?行,然后其次的话呢,我们说这个内存呢,如果你比较小内存呢,小100兆用串行的,如果单核的单机程序的也没有停顿时间要求啊串行的。啊,因为我们这个串行那块呢,它是ITW的是吧?呃,如果呢,你是这个多CPU的,然后呢,注重这个吞吐量,而且呢,停顿时间呢,要求也不是那么高啊,这个一秒以上也行,那当然了,我们就选择这个叫并行了。并行的parallel对吧,Parallel呢,主打的是不是就是并行啊叫主打这个叫型这个这个叫什么吞吐量是吧,那如果呢,你是这个多CPU的哎,如果你是多C的追求呢,叫做低停顿时间,然后需要快速的响应啊,这就涉及到我们跟用户交互呢,要稍微的多一点了啊,这时候建议呢,你就得使用这个要并发的了。
10:01
哎,是用并发的,并发的CMS可以啊,当然你要说用的版本JDK特别新呢,不能用CMS的时候怎么办呢?你可以官方推荐呢,用这个g first啊,性能比较高一些,那目前的这个互联网项目,基本上我们用的都是这个g first啊,诶都是这个g first。行,这个呢,我们就可知道一个选择,然后最后呢,给大家分享一个观点啊,就是说嗯,虽然我们讲了这么多的垃圾回收器啊,始终呢,我们想强调一点,就是没有最好的收集器,那我们都在不断的去更新迭代优化的过程当中,对吧?诶那么再过一段时间呢,又会发布这个叫JDK15了,诶那么我先做一个预测,这这个15当中一定会提到垃圾回收器的一些优化啊,不排除呢,对这个ZJC呢,底层还会做一些调整,看看哪一天我们能够尽快的迎接这个,诶ZJC去替换咱们这个,诶这first,哎,当然即使呢是这个CJC,它还是有不断的优化场景啊,因为说我们这个硬件环境啊,包括这个具体项目的业务啊,是不是不断的都在变化呀,那就意味着垃圾回收器呢,也需要不断的做调整啊呃,那么调用呢,那不管你使用的是哪款垃圾回收器,那调的时候呢,我们一定要根据具体的场景去定。
11:08
啊,有的人总想着说说能不能给点公式是吧,这个时候呢,用这个那个时候用这个这个是很难的,因为我们实际的这个业务场景啊,千变万化啊,你一定要针对具体的场景,具体的业务需求啊,只要一个需求呢,变了,有可能我们这个条约的这个手段呢,也都要随之呢做这个改变。啊,就要做改变,那正因为这个不确定性,所以呢,是不是才展现了,当你真正有相关的一个经验的时候呢,你的价值是不是才越高啊。对吧,那如果说这个事情呢,都可以自动这个让GM呢去做一个来设置,我们写个算法,他就自己能做了,那这个人的价值呢,是不是就低了,那你的价值呢,是不是就体现不出来了。能理解这意思是吧,好,那么后边这块呢,这个针对于公立一点讲,我们看这个面试啊,然后咱们相当于是也是做一个收尾呼应,在开头的时候我们也提到过,说这个面试的时候呢,关于垃圾回收器这块呢,问的啊还是比较多的是吧,那么咱们最后呢,再做一个收尾。
12:04
呃,针对这个垃圾收集啊,面试官可以循序渐进呢,从理论啊,实践啊,各个角度去深入,当然也未必呢,要求面试者啊,什么都懂啊,换句话说呢,面试官也不一定什么都懂。啊,这个大家面试的时候呢,心态一定要好,就是你想想,如果你要是个面试官,你想为难这个面试者,那是不是是so easy的一件事情,对吧,也就是说把你跟面试官呢,你俩角色对调啊,你也能够问出很多问题呢,他不会的啊,一定是可以的是吧?行,那如果说你懂得这原理啊,我们说一定会成为面试的一个加分项,这是毫无疑问了,那么咱们大家可以关注的这个事儿啊,第一个垃圾回收的算法有哪些?咱们呢,在第15,这是第17章了,咱们在讲这个第15章当中的时候,咱们就讲了这个相关的这个算法,对吧?哎,这个标记阶段呀,还是轻度阶段都讲过了,那如何判断一个对象是不是可回收呢?啊,判断它是不是可回收怎么办啊啊,可达性分析是吧?这些root啊,还有我们提到那个finalize这个方法啊,就是如果说不可达它一定会被回收吗?啊是不是我们有一个finalize涉及到叫可触及的可复活的是吧?还有不可触及的这样几个过程是吧?哎,这些细节呢,是不是展开这一说就很丰富了,哎,这就相当于我们懂得这个原理了啊然后具体的这个垃圾回收器它工作的流程是什么样子呢?这个咱们前面是不是都讲过啊,包括这个j first呢,最复杂,这个咱们画的笔墨时间也最长。
13:24
哎,讲了这个first了,OK。啊行,那最后呢,我这块又多加了一条啊说大家呢,还是要关注一下这个常用的参数啊,因为经常呢,我们在面试的时候呢,也会问你啊说这个呃,你常用的这个GM参数有哪些呢?这块这个参数呢,主要呢,是不是涉及到两方面,一个呢,就是我们在设置这个内存的时候,对啊,这个方法区域啊,是不是涉及到一些这个参数,对吧?另外呢,就是我们这个垃圾回收哎,这个环节我们涉及到一些参数,诶这块呢,大家去稍微的有意识的你记一记就行。对吧,行,那这块呢,关于我们这个垃圾回收的一个总结,咱们就说到这儿。
我来说两句