00:00
那简单的介绍了我们说七种经典的垃圾回收器之后啊,咱们来看一下这个七种经典的垃圾回收器跟垃圾分带之间的一个关系啊,这里边提到垃圾分类呢,实际上是针对我们说Java的一个堆空间,对吧,那堆空间的话呢,我们说分成了叫新生代和养老带,或者叫做老年带啊都可以,那么我们这七种垃圾回收器啊,它并不是说呢能够,诶每一个都能够回收整个堆的,诶不是这样子的啊,那我们要看一下他们具体的回收的区域是什么,那我们能够很清楚的看到前面的这三个蓝色的啊,他们三个呢,只能够用来回收,这叫新生带。啊,Zero j c parallel scven j c和panel j c啊这三个,然后针对于我们这个老年代的话呢,诶这里边橙色的这三个啊zero old啊parallel old,还有这个CMS,他们三个呢,只能够用来回收老年代。那针对于我们这个g first垃圾回收器啊,它是比较特别的,它呢既可以回收新生代,又可以回收老年代,真的是它比较特别的地方,那就有点像这个,呃,咱们夸张一点想,生活当中这是男人三个男人是吧,真的是三个女人啊,这个大家做的事儿都不一样,那这个呢,是啊都行是吧,你适当的时候呢,可以充当男人,适当的时候也可以充当女生的角色,是吧?哎,比较特别一点,正常来讲的话呢,就是他们只能各自回收各自的,哎,这一个带啊,他比较特别行,首先的话呢,大家把这个事儿呢,先记住它。
01:25
诶,这个图要记住,它就是说哪些垃圾回收器是专门回收新生代的,哪些是专门回收老年袋的,那又有谁呢?是既可以回收新生代,又可以回收老年袋。哎,这个呢,先掌握是吧,然后接下来的话呢,咱们看一下这个垃圾回收器啊,他们的一个组合关系,通常我们说的男女搭配干活不累对吧,我们一个新生代垃圾回收器,是不是需要对应的一个老年代的垃圾回收器啊,这就我们所谓的叫组合关系,OK,那么这张图的话呢,大家注意啊,这张图你赶紧呢截个图保存一下。保存一下,过期不候是吧,为什么呀,因为呢,大家去网上啊,你能够找到很多的跟这张图实在是太像的图啊,你要说区别是什么呀,区别就是大家的一个新旧程度不一样,我这个呢是最新的。
02:10
诶,我这个是最新的,那新到什么程度呢?新到咱们前段时间是不是刚发布的叫JDK14啊,那我这个图呢,已经更新到JDK14了,大家在网上搜索的时候呢,通常啊,通常的话呢,你搜到的那个都是更新到JDK8之前的啊,也就是说小于JDK88都没有在八或九的时候呢,有一些变化。哎,八或九的变化呢,就是我这里边两个红线,红色虚线,那么JDK14的变化呢,就是这个绿色的线跟这个青色的这个边框这个线,这是JDK14当中的一些变化,所以我这张图呢,真的是最新的,所以赶紧截个图。好,截完图以后的话呢,我下边来给大家做一个简单的介绍啊。那么首先的话呢,就是这里边这个虚线啊,你先把它看成是一个实线,看成实线的话呢,就是我们JDK8之前注意不包含JDK8我们的一种组合关系,也就是说呢,我们如果新生代的话呢,用的是CJC,老年代呢,我们可以使用CMS或者使用这个CO的啊这个新生代呢,使用这个panel,我们老年代可以使用CMS或者是Siri old啊它呢也类似的是吧,使用Siri old或者是这个parallly old,诶就这样个组合关系啊这个嗯,然后大家你可能首先呢注意到,诶这块怎么还有一根线是吧?说呢,我们新生代老年代说一男一女是干活不累,那怎么现在还有一个女女的一个搭配呢,这个呢,我们是一个后备方案啊,哎,后备方案。
03:33
什么叫后备方啊,就我们这个CMS呢,回收器,咱们下边呢,也会详细的去展开讲它它呢比较特别,它不能是在这个老年代呢,这个空间板的时候才会回收,他呢需要提前回收,因为它是一个并发的嘛,就是相当于他在垃圾回收的同时呢,用户线程还在执行,那就用户线程还有可能是不是制造新的垃圾啊,所以他要提前的垃圾回收,那如果说呢,这个回收的比较晚了,或者说呢,你这个垃圾制造的一个速度比这个回收速度还要快,那这个时候的话呢,它会出现这个回收啊failure是吧,失败的一个情况,那你一旦要失败的话呢,咱们会选择要sir old呢JC做一个后备方案。
04:07
哎,做一个后备方案啊,我们可能会触发这个for jc是吧?诶然后把这个呃内存的用户线程都给它停下来,然后我们赶紧做一个诶全部的一个JC,哎,就是它属于一个后备方案,就要像呢,说男女干干活,男女搭配干活不累,说这个女生啊身体欠妥啊,所以说呢,这个女生是他的搭档,那如果说他身体要不好的话呢,呃,让这个女生呢,直接呢去替换她是吧,这就是一个后备方案啊。好,那么首先呢,把这根线呢,我们先解释清楚了,然后的话呢,我们说一下,在JDK8当中,哎,在JK8当中呢,取消了,诶它俩的组合和他俩的组合,在八登呢,只是一个叫depreated,就是它是一个叫叫什么废弃是吧,但是呢,你要非要用是不是也能用啊,这就我们说这个废弃的一个意思哈,在GTV9当中呢,是把这根线跟这根线呢,彻底的做了remove。Remove remove就是移除的意思,就是没有,就是你不能再去这样去搭配了,完全的不能用了。
05:01
哎,这是注意一点啊,然后的话呢,我们说一下这根绿色的线,这根绿色的线啊啊,我们呢说在JK10字当中说启用了啊parallel garage和这个SOLD的这样一个组合,其用呢,就是我们现在把它呢做了一个depreated,那它在未来的版本当中呢,就一定会把它也做一个remove,也就是说呢,我们如果说新生代呢,你用的是一个并行的垃圾回收器,是不是我们就没有必要呢,老年代这块用这个串行的啦,那你就是不是老老实的也用并行就可以了。哎,就这意思,所以我们这个呢就不要了。哎,这个注意啊,然后另外的话呢,你看这个边框呢,这算是一个青青色的是吧,那这个呢也不要了,这是CMSCMS的话呢,在我们这DK10当中做了一个幕。哇,竟然是水木了是吧,把这个CMS呢垃圾回收器呢给它删掉了啊,删掉了也不用了。啊,也不用了,那CMS的话呢,我们说在历史上呢,它是有很大的作用的啊,它是第一款呢并发式的垃圾回收器啊,由于呢,我们说在GDK9的时候,咱们这会儿讲历史的时候也提到了GTK9当中呢,是不是这个j first呢,已经是作为默认的垃圾回收器了,而而且呢,它是不是新生代老年代是不是都可以啊,诶所以现在呢,我们主要用的是这个g first啊,那要是除了这个first之前都用什么呀,在JDK8当中,咱们用的呢,是parallel scwi和这个parallel old它俩的这个组合,也是我们所说的这根线。
06:22
啊,也就是说呢,大家你看啊,刚才我们讲完这个JDK不同版本变化以后,你把这里边儿这个虚线你给它去掉。哎,去掉以后呢,这根线呢,咱知道就是储备的是吧,后备的这个呢,也先忽略掉,是不是就剩了三根这个黑色的线了。对吧,也就是说在我们JDK8当中呢,咱们这一组操作呢,它是默认的垃圾回收器,新生代pararollel房间带parallel后。啊,就是这样的一组一个组合,那你如果要是不用这个组合的话呢,你还可以使用我们这样一个组合。诶,这个组合里边呢,就是新生代呢,我们用的是panel,就是也是一个并行的垃圾回收器,然后呢,这个老年代呢,我们是用的CMS是并发的啊强调的是这个低延迟的一个效果,哎,你可以用这根线。
07:05
那可以这样,然后呢,你如果是用的是这个,比如说我们说Java虚拟机的它的一个客户端,那客户端或者说你这个是单CPU的这个场景下,我们可以使用这个串行的这个组合啊,C跟这个CO的,哎,使用这样的一个组合也可以,哎其实实际上呢,是不是就剩这三根线了,那现在呢,又由于我们这CMS呢,如果被干掉了,那其实呢,是不是就剩这根线,这根线还有这个G1了。对吧,哎,这个注意一下啊,那这里边儿呢,大家可能会有一个疑问。有的说,诶没什么疑问,我觉得听的挺好是吧,那我你编个疑问哈,这个疑问的话呢,就是说我们这个panel呢,跟parallel他俩都是并行垃圾回收器,说为啥你这个CMS呢,它能跟我们这个panel去搭配,它怎么不能跟这个parallel呢去搭配呢。能理解吧,哎,为什么CS不能跟它去搭配呢?哎,这里边我们提一下这个powerline的话呢,它跟咱们其他这个垃圾回收器啊不太一样,它那底层呢,用的是这个,诶这些的这个框架跟其他的不一样,框架不一样的话呢,导致我们这个CMS呢,就跟这个排量呢,它俩就不能够去兼容,所以呢,我们就没有这根线了。
08:09
啊,而我们呢,诶这个CMS呢,跟这个panel呢,他们是兼容的,哎,所以这呢是有这根线。这个呢,大家稍微注意一下啊,稍微注意下,那么单纯这个从呃并行的角度来看的话,这个panel跟parallel啊,其实他们的这个性能上差别不是特别大,哎,相当于就是使用不同的框架的话呢,这个parallel呢跟parallel old呢,它俩就自成一个体系是吧,它俩呢去搭配使用,然后呢,你不是用的这个呃,它这套框架的呢,我们说它俩呢是诶这个搭配去使用,诶就是这样的一个道理啊。OK行,那么这个图呢,我们就说清楚了,后边呢,咱们在讲解具体的垃圾回收器的时候,包括最后总结的时候呢,我们还会再说这个图,OK行,这个咱们就过了啊,然后的话呢,我们看这个说明。说呀,为什么要有这么多垃圾回收器呢?一个不就够用吗?啊,或者一个不够用吗?啊,这个你看怎么讲啊,咱们前面呢,讲这个针对内存当中的这个排序啊,咱们是不是有这个经典的叫排序算法啊,想必呢,每个人肯定都写过是吧?哎,经典的内存级别的排序算法,然后我们说是有十大这个排序算法啊,有这个吸式排序啊,堆排序啊,快速排序啊,直接选择排序啊,冒泡排序啊啊归并排序啊等等啊统排序是吧?有十种排序,那么咱们说呢,排序里边是不是也没有一个说在各个场景下都是最好的这样一个排序方式,那如果有的话呢,我们是不是就没有必要讲十大了,是不是就留一个就行了。
09:34
哎,这个很好理解,那对于咱们这个垃圾回收器呢,也是同样的道理,由于我们这个Java语言呢,它使用的场景啊很多,有这个移动端,我们可能更看重的就是这个交互是吧,这个交互效果要好一些,那也有也有呢,是针对这个服务器端,我们希望呢,这个吞吐量呢要更大一些,因为呢,这个场景的不同啊,所以说呢,咱们就要选择不同的垃圾回收器。就跟说我们这个数组内存级别的啊,你这个数组呢,如果整体上基本已经有序了,还是说呢,就是完全混乱的,在不同的这种场景下的话呢,我们使用不同的排序算法呢,实际上呢,性能也不一样,没有一个说呃放置四海皆最好的这样的一个排序算法存在啊,这呢也是同样的道理。
10:14
你看同样道理哈,呃,那么后边呢,咱们就会,呃,针对每一个垃圾回收器呢,咱们都会去做一个讲解是吧,虽然呢,我们会对各个垃圾回收器进行讲解,而且进行比较,但是咱们的目的啊,并不是为了挑选一个所谓最好的垃圾回收器。那如果真的要有个最好的话呢,那其他那些咱就没必要讲了,是吧,你会讲这七个干什么,有个最好的,那我们就用最好的,其他全干掉,但事实上的话呢,我们发现这first也好,还是说这个搭配也好,还是说这个,呃,串行的搭配也好,他们在各自的场景下啊,还是有具体的应用场景的,你说串行的不行,那实际上呢,你要说是单词的话呢,我们用串行要好于你用这种并行的了。啊,执行效率反而要更高一些,就是在单CPU的厂家,因为你这块是不是还要切换不同的线程是吧,这个不用切换啊,所以这个呢,反而吞吐量更大。
11:01
啊,都有各自应用的场景啊,你想想如果我们要是有一个所谓的最好的话呢?啊,Housewa虚拟机是不是也没有必要呢去实现这么多了是吧?哎,咱就讲一个就完了啊嗯,没有一个放真四海皆准的,在任何场景下都能够适用的完美的诶收集器的存在没有万能的,那我们需要做的是什么呀?就是咱们根据具体的场景啊去选择合适的收集器。啊,所以这里边儿对咱们程序员呢,也有一个要求,就虽然说呢,垃圾回收器,它回收的这个细节啊,咱们可能不用关注太多,因为是自动垃圾回收了,但是呢,你要能够有一个能力去选择,在什么场景下,我们应该选择什么样的回收器。诶,这个呢也是咱们你看后边呢,是不是要讲上篇中篇和下篇,下边呢叫性能监控与调优,那么怎么能够使我们Java这个虚拟机能够这个发挥最大的一个效能呢?诶关于我们这个垃圾回收器的选择,这块也是比较重要的一个场景,包括呢,咱们前面讲的这个内存是吧,所以说这块呢,调有监控呢,一方面呢,我会讲相关的一些工具啊,这个有命令行的工具,有这个GI层面的一些工具,另外的话呢,从这个程序的角度来看的话呢,我们已经讲的这个内容当中,比如说你如何的去分配堆空间中各个带的一个比例,根据实际的一个代码情况是吧,然后呢,如何去合适的选择必要的准确的一些垃圾回收器,诶,这呢,都是我们要讲这个监控与调优的这个东西。
12:23
啊,那通过这个的话呢,是不是也能够凸显出来我们这个人的这个价值了,是吧?哎,不用它自动的去完成了,而且呢,如果你这块呢,确实也比较清楚,有经验的话呢,那一定你的价值呢也会更高一些啊这就我们要强调一个点啊,根据具体的场景,咱们去选择最合适的,也没有一个方山四海皆准的一个公式啊,这个大家要注意一下,好这呢,就我们把这个,呃,垃圾回收器他们相互之间的关系啊,咱们就说清楚了。
我来说两句