00:00
那咱们讲清楚这个吞吐量和暂停时间的一个对比之后啊,咱们来看下一个问题,诶第二个问题的话呢,我们想谈一谈不同的垃圾回收器的一个概述,OK,那我们看一下说呢,垃圾收集机制啊,是Java的一个招牌能力,那我们提到了,诶一提到Java虚拟机,我们主要呢,会提到Java的一个叫,诶第一个叫自动的内存分配对吧?诶第二呢,叫垃圾的一个自动回收机制,所以呢,垃圾回收呢,是Java的一个招牌能力,它极大的提高了我们开发的一个效率啊,不需要我们程序员呢去手动的回收这些内存,对吧?所以呢,这也是咱们面试的一个热点。啊,那么典型的一道问题呢,就是说Java中常见的垃圾收集器能有哪些,当然呢,具体展开的话呢,问法可以很不同,那它甚至呢,可以就让你去分析其中的呃,一款到两款垃圾回垃圾回收器,乃至于说呢,让你做一个对比,对吧?诶是这样子的,那么这道问题的话呢,我们在这一章当中会做一个详细的解释,那使得大家呢,能够达到一个场景呢,就是说呃,这个问题抛出来以后,你实际上呢,是可以答这个,乃至说一个多小时,对吧,你可以把我们说经典的垃圾回收器七种,还有呢,GDK11当中,像这个ex jc,像JJC像圣圳豆啊JC他们的一些解决的痛点是什么,是吧,现在发展到什么程度了,哎,都可以做一个解释。
01:14
啊,那这个呢,我们这一章呢,都会给大家讲清楚,OK,行,那么这道问题的话呢,如果我们说直面它的话呢,一个呃,典型的回答是什么样子呢?大家可以开头呢这样去描述说实际上呢,我们说这个垃圾回收器啊,它跟具体的GGM呢,一定是紧密相连的,毫无疑问对吧?那么不同的厂商,呃,我们提到像Oracle也好,像IBM也好,像redha也好,他们呢,实际上会考虑提供不同版本的GM,那么不同版本的GM的话呢,它就可以考虑使用不同的垃圾回收器。啊是这样子的对吧?那么接下来的话,你说我可以介绍一下主流的垃圾回收器有哪些啊,就是展开你接下来这样一个介绍,呃,也就是呢,你首先明确一下我们GM对吧?它呢是可以呢,可能有不同的厂商去实现的,那么对应的这个GM搭配的这个JC的话呢,我们也可以有不同的这个JC啊是这样的一个场景啊,因为呢,我们在实际开发场景当中,呃,情况太多样了,有的呢,是需要这个跟用户交互的时候呢,效果要好一些,延迟要短一些,有的呢,是我们做这个服务器端需要呢,这个吞吐量呢要高一些,那么在不同的场景下,我们使用的GM对应的JC啊,一定是有区别的。
02:22
好的,那么首先的话呢,我们先来关注一下叫垃圾回收器的一个发展史啊,这个呢,我觉得呃,需要大家整体呢去了解一下,对吧,那我们要讲的这个垃圾回收器呢,很多,那简单的看一下它这个迭代过程是如何的啊,那有了垃圾收集器,有了虚拟机之后啊,我们说一定是需要的叫哎垃圾收集机制了,这呢,我们提到两个JC的词,诶之前咱们也提到过啊,一个词呢,叫garbage collection啊,就是叫垃圾回收,那另外呢,对应的这个产品呢,我们称为呢叫garbage collectionor啊,也称为呢叫JC叫垃圾回收器啊或叫垃圾收集器啊都可以行,那么整个这个迭代历史的话呢,我们看一下,在这个九九年的时候呢,这个GP1.3当中提到了一个叫CJC啊,这呢就我们称为叫叫串行的回收器,这呢也是我们第一款的JC啊,就是垃圾回收器。
03:10
啊是串行的,它呢,对于我们说这个单核CPU的场景,包括呢,是这个客户端的场景的话呢,它的这个回收效率还是非常不错的,那么对应的另外一个呢,叫做panel,这个panel呢,垃圾回收器的话呢,相当于是C的一个多线程版本,也就是说呢,这个panel呢,它是一个并行的垃圾回收器。那针对于我们说这个服务器端的话呢,这个呃,相应来说或者多CPU的场景下,它的回收效率呢,会更好一些,对吧?OK,然后在这个零二年的时候呢,呃,提到了一个叫parallel j c啊,或者叫parallelin j c,还有呢,叫CMS啊,它的全称叫con mark sweep j c,哎,Markweep就是我们前面提到叫标记,是不是清除算法呀。哎,Mark sweep,然后conar就是并发的意思,哎,这样呢,两款这个JC呢,在JP1.4的时候呢,发布了。OK,那么parall这个JC呢,在GDK6的时候呢,就会成为就成为了house的一个默认的JC。
04:05
啊,默认的一个JC,它呢,呃,适用于我们说的叫新生代,那老年代的话呢,它对应的一个叫parallel old的JC,哎,是这样子的啊,搭配去使用,那么在一二年的时候呢,JDK1.7的时候引入了一个叫g first啊,这也是我们目前这个说比较关注的一个垃圾回收器,叫做g first,对吧?OK,那么在一七年的时候呢,GTK9当中提到了,说这个g first呢,成为默认的垃圾收集器,替换了CMS。诶前面的话呢,我们提到过说,呃,默认的提到了叫parallel还parallel old的JC,它俩呢是可以搭配使用的,那另外一个呢,场景我们可以使用的,就是在你关注于这个叫低延迟的这个场景下,哎,我们可以使用这个并发的叫CMS,但是这个CMS的话呢,它没办法跟这个parallel呢,它俩去搭配使用啊,这个咱们后边也会讲个图啊,大家也可以简单看这个图,这个CMS的话呢,它需要跟我们这叫PI new啊,这个JC呢,它俩去搭配使用,也为这是一对组合,或者的话呢,就是我们这个parallel呢跟我们这个parallel old它俩呢是一组组合,在不同的我们这个生产环境下呢,咱们可以让这个GM呢虚拟机去使用这一对组合,或者呢,是这一对组合。
05:14
OK,那在咱们这个呃,硬件水平比较低的场景下呢,咱们才会去使用这个串行的这两个的组合,诶,OK是吧?行,那么在我们这个呃JDK9当中呢,这块提到了叫g first啊这个垃圾收集器呢,就成了我们默认的垃圾收集器,而这个j first的话呢,它的特点呢,就是兼具回收新生代和老年代,那你看它是跨到这个两边了,对吧?诶跨到两边了就相当于它既可以实现新生代的垃圾回收,又可以实现诶老年代垃圾回收,哎这样一个特点,它呢成为了一个默认的垃圾收集器,从JDK9开始。那么一八年的时候呢,这个JDK10当中啊,这个这份的话呢,垃圾回收器,它的一个并行完整垃圾回收啊,改善了这个最坏情况下的一个延迟,这是什么意思啊,就是我们在这个这缝当中,咱们其实也比较关注它这个低延迟,那既然你关注这个低延迟的话呢,我们尽可能的使用的叫并发行为,对吧,就在你清理的时候呢,并发行为,那在这个GDK10的时候呢,就完成了它的一个并行操作,那么垃圾回收的一个并行处理,那很显然呢,我们是不是能够提高它的一个,呃,叫什么吞吐量,对吧。
06:18
啊,能够改善这个吞吐量,那同时的话呢,我们还可以呢,去控制它在呃,你限定的这个时间之内啊,限定的延迟时,延迟时间之内呢,我们去完成,所以呢,这个G相当于是完成了一个,就像咱们前面提到的。看前面提到了这样一个词是吧,就是在最大哎吞吐量优先的情况下呢,我们去降低这个停顿时间,那这first呢,就可以限限定一个停顿时间,在尽可能满足这个停顿时间的情况下呢,我们提高最大的一个吞吐量啊,那提高吞吐量的话呢,我们尽量的是不是叫并行的一个操作呀。对吧,OK啊,那么一八年的时候呢,GDK11发布这块呢,算是一个分水岭,诶这个大家注意一下啊,这是一个分水岭,那么前面的话呢,我们已经提到了啊,这块呢,相关的一些垃圾回收器啊,其实一共是有七种啊,大家现在数呢,你可能感觉不够啊,因为缺呢叫Siri o和我们这个叫parallly o啊一会儿我们说那么分水岭之后,在JDK11当中呢,我们引入了两个新的垃圾回收器,一个呢叫做ex long垃圾回收器,它又称为呢叫nu option,就是无操作的垃圾回收器。
07:23
那咱们到最后这我给大家介绍一下,然后同时的话呢,在JDK11的时候呢,引入了一个新的啊垃圾回收器,这呢也是我们未来的一个希望之星是叫ZJC。啊叫ZJC,这个Z呢,我没深入的去研究啊,不知道呢,是不是说Oracle官方呢,就是把它呢,因为我们知道26个英文字母,最后一个是Z是吧,是不是他把他这个意思呢,就想说,呃,我这呢是最后一个我想退出的这个垃圾回收器了啊,也就是说呢,它不需要再去更新了啊,不知道是不是有这样的一个想法啊,这个ZJC的话呢,它是叫可伸缩的低延迟的垃圾回收器,但是你注意呢,它到目前为止还是experimental啊,就是实验性的一个版本,还没有正式的在我们JD当中引入进来。
08:07
啊,一旦引入进来以后呢,它很显然呢,是要替换我们的first,毫无疑问啊,因为在后续的一些测试当中啊,它这个性能呢,已经是超过了我们这个g first,包括呢,Parallel这个组合啊。行,那么在一九年的时候呢,三月份我们又发布了GT12,在GT12当中呢,对这个g first呢,又进行了一个优化,就是我们虽然呢,引进来新的垃圾回收器了,不断的对它呢进行一个升级,但同时的话呢,我们对现有使用的这个g first呢,还在进行一个优化。那同时的话呢,在我们这个JDK12当中啊,这个JDK12咱们前面提到过Java呢,发布这个版本的话呢,都有两个版本,一个呢叫做Oracle jdk对吧?哎叫Oracle jdk,那另外一个呢,是不是还有一个叫open jdk啊啊那么嗯,Oracle官方呢也提到了,说基本上呢,这个Oracle jdk和open jdk呢,它们是共用一套源码的,那共用一套源码对吧?呃,但是的话呢,我们会发现呢,就是它整个功能呢,基本上都是一样的,但是我们发现呢,在open jdk在12这个版本当中,竟然呢open jdk多一些东西。
09:09
啊,这个呢是很少出现的,对吧,因为这是个免费的,上面是个收费的嘛,在open gdk12当中呢,我们这个提到了一个新的垃圾回收器,叫做深圳do GC这个呢,是由红帽公司呢,他们诶主导来研发的,诶也是一个叫低停顿的,哎JC就是这个神do jc呢,跟我们这个ZJC啊,他们俩的这个目标啊是比较一致的。但是呢,区别在哪呢?区别就是这个ZJC呢,是Oracle官方发布的,诶我们称为呢,叫什么根正苗红是吧?诶所以呢,从这个官方的角度来讲的话,一定是重推ZJC,那么为什么open,呃,Oracle jdk12中它不放它呢?那排挤他呗,对吧,你又不是我自己官方发布的,你是你那个红帽公司发布的,那你就在你open jdk中去发布吧,2JDK中我根本都不植入你,对吧?诶这个呢,很显然他们俩命运呢,是不是以后一定是不一样的的。啊是这样啊好,那么在这个19年9月的时候呢,说JDK13发布,这个时候呢,说增强了这个JJC啊,自动返还微微使用的这个内存的跟操作系统啊,对内存跟操作系统啊,这是做了一个优化,然后呢在呃今年这个三月份,就前段时间呢,我们JDK14呢又发布了,这时候呢,有一个非常重要的变化呢,就删除了这个CMS来回收器。
10:20
啊,这个CMS垃圾回收器呢,它是在这个我们说这个1.4的时候呢,这时候一起发布的,那么后续的话呢,它的应用场景还是非常多的。因为它应该算是咱们第一款真正意义上的并发的垃圾回收器啊,达到一个低延迟的一个效果。呃,D的效果,呃,但是的话呢,我们会发现呢,在今年的这个三月份的话呢,我们已经完全的把CMS呢给它删除,删除了就是不再使用它了,它已经成为历史了。已经成为历史了,那么未来的话呢,我们呃,一方面呢,是J1先用着,那那未来的话呢,咱们一定会使用上z jc OK,那同时的话呢,在JDK14当中,咱们也扩展了ZDC在呃,Mac系统上和Windows上的一个应用,因为之前的话呢,都是使用在这个Linux系统上的。
11:04
啊,是这样子的,那么到今天的话呢,这个CDC呢,也没有摘下这个experimental这个帽子啊,那么在未来的版本中一定会确定下来的,而且一旦确定之后呢,这个g first呢,它就危险了,哎,它就不再是一个默认的垃圾回收器了,那对于咱们现在来讲,咱的中心呢,呃,因为这个在实际场景当中,我们用的是g first还是居多的是吧,所以这呢也算是咱们要讲解的一个中心,那同时的话呢,关于这个Z呢,咱们也会引入进来。OK,那记住呢,这个分水岭啊,是从我们这个开始的是吧?行,那么接下来的话呢,我们把刚才呢,提到的这个垃圾回收器呢,稍微的做一个梳理,呃,刚才呢,提到一个分水岭,在这个分水岭之前的时候,也就是我们这块内容当中,咱们呢,一共提到了叫七种啊垃圾回收器。哎,一共提到七种,但实际上你要往上翻呢,不够七种,哎,我们说缺两个old的是吧?哎,把两个old那个补充上呢,就是七种了,那这七种经典垃圾回收器啊,分别有哪些呢?诶,串行回收器呢,提到了叫zero和zero old,一个呢,新生代,一个老年代,那并行的回收器呢,哎,Piel parallel s skyven和parallel old,哎这呢也是三款。
12:14
哎,这呢也是三款。OK啊,然后这个并发的垃圾回收器呢,提到叫CMS和g first,当然这个g first的话呢,我们这个后期呢,它在不断优化啊,也可以称为呢,你叫做并行回收器啊也可以啊也可以行,这呢就是我们提到了这个一共是有七种。啊有七种,哎,这呢,我注意没有大家注意啊,没有提到这个叫EXJC,还有我们这个ZJC,还有这个叫SJC,啊这呢都是属于我们这个新的时期啊,提到了新的垃圾回收器。那也就是说呢,大家会看到了,关于这个,呃,垃圾回收器这方面呢,你看在不同的版本当中,是不是每一个版本都会有一些变化呀,对吧?反而呢,我们这个内存层面呢,咱们在这个GDK7和八当中,这个原空间引入之后呢,诶基本上就确定下来了,哎,后续变化都不大啊,那么垃圾回收器这块呢,大家在不同的这个GDK新版本当中,一定要多去关注一下,OK,那这儿呢,我们提到了是不是叫经典的垃圾回收器啊。
13:10
对吧,那怎么去理解经典这个词啊。标个红。什么叫经典呢?哎,那我们一提到说经典的这个排序算法是吧?哎,我们提到有十种,那就不意味着我们后来呢没有新的,那新的话呢,跟经典呢,可能还是有一些区别的是吧?哎,不同的场景啊,或者基于新的思路啊等等啊,包括呢,一提到说经典的,哎人工智能的一些算法,那可能我们提到就是机器学习算法了,那现在呢,我们说人工智能的话呢,AI主要呢,咱们针对的还是深度学习是吧?诶它有新的一套这个算法去实现,那效果呢还更好啊,所以这个我们提到叫经典。啊,咱们这儿呢,提到这个叫经典呢,主要目的呢,还是要跟咱们之前提到的这些啊,就是1JCZJC和神德JC呢,标识他们处于叫实验状态,跟这个呢是做一个区分,哎这呢我们称为呢叫经典,哎,但是在这个执行效果上来讲的话呢,诶这个我们说具有革命性的啊,改进的高性能低延迟的数据器啊,就是我们提到下边这几个主要呢是这个ZJC和深圳斗这些呢,希望跟他们呢做一个区分。
14:16
啊,希望做个区分,就是咱们现在呢,提到的这一共是七种,虽然说呢,从这个技术上来讲呢,他们算不上是最先进的啊,但是呢,他们在这个JDK历史的发展过程当中,是不是叫千锤百炼是吧?啊然后现在已经是足够成熟了。啊,而且呢,我们也能看到在未来的两年到三年的时间之内呢,在这个商用的环境下啊,大家还是可以放心的去使用的,诶还可以放心的使用,那么针对于这个呃,我们说未来的这个像ZJC和或者是叫神圳do jc,其实这里边大家主要关注就ZJC就可以了哈,诶它是在官方自己推的,而且它的呃,从数据上来看,哎,我看到一些数据来看呢,这个ZJC呢,比这个新在豆JC呢,其实还是要好一些的啊,那么这个JC的话呢,咱们未来一定会引入进来,而且性能呢非常强大,但是暂时的话呢,它还在不断的迭代,所以从商用的角度来讲呢,大家还是先关注一下我们这里边儿提到的这七种,诶经典的垃圾回收器就可以了,首先呢,需要大家你把这几个呢都记住。
15:14
那先记住它啊,然后这块呢,有个图啊,这呢是从网上找一个图啊,这个有点太绿了,哎,我也没有重新画一个啊,哎,基本上我们也能看得清楚,那么zero呢,我们叫串行啊,非常清晰,就是在垃圾回收啊这个黄色的表示的这个过程当中啊,只有这一个线程啊,这呢我们叫串行的这个垃圾回收器,对吧?啊,那么parallly的话呢,我们叫并行的垃圾回收器啊,因为我们看到这个在垃圾回收这个阶段的时候呢,咱们有三个线程啊,不止一个线程了,三个垃圾回收的线程,这叫并行的,那么CMS的话呢,是我们说第一款啊叫并发的垃圾回收器啊,因为大家你看关注到这个阶段的时候呢,我们的用户线程和垃圾回收的线程是可以这个叫诶并发执行是吧?哎可以同时执行,这呢就是一个并发的过程,那这个这份的话呢,我们看到诶这个结构好特别啊,跟前面几个都不一样了,诶这也是诶他为什么能够这个实现新生代和老年代的原因啊这呢我们提前面呢提到过叫做分区算法对吧?哎在这呢,我们给大家去提一提。
16:12
诶可以实现呢,叫新生代和老年代共同的垃圾回收啊OK,呃,那再说一个图呢,就是大家呢,如果说想从这个官方的这个文档当中啊呃,获取一些学习的一些文档的话呢,大家可以去这个链接地址,呃,这个呢,你看也是Oracle这个官网发布的啊呃,这呢是这个散公司啊,在这个06年四月份发布的一个文档,这个文档呢,有二十来页,诶是一个PDF啊,这个我已经下载了哈,这个大家的话呢,你可以按照这个网址呢,直接你去网上去下载就行,然后在这个官方文档当中,他提到了关于像我们说呃这个串行呀,并行的呀,是吧?CMS啊,诶这里边都有做一些介绍啊,官方的话呢,我们说相对应的是最权威一些的,对吧?OK,大家如果有兴趣的话呢,你也可以看一看这个文档。OK,这呢,咱们就整个呢,关于这个,呃,垃圾回收器呢,先有一个整体的概述啊。
我来说两句