00:00
诶,那接下来啊,咱们就来看一下这个第一节啊,第一节呢,咱们是说一下这个垃圾回收器的一个分类啊,以及呢,这个性能指标我们如何去衡量,OK,那首先呢,我们来看这里边这个描述说呢,叫垃圾收集器或者叫垃圾回收器,没有在这个规范当中进行过多的一个规定,可以呢,由不同的厂商,不同版本的GM呢来进行实现啊这个大家应该能理解吧,就是我们这个GM规范当中其实没有它,呃,明确说说我们要用这样的垃圾回收器,说呢,你用别的不行啊,这是不对的,对吧?因为我们知道这个Java的话呢,它是不是一个呢,是咱们发布了叫Oracle这个版本的一个JDK啊,然后另外的话呢,是不是对应的还有一个叫open版本的一个JDK啊啊,那对于这个open版本JDK来讲,其实不同的这个厂商的话呢,可以在基于这个open jdk,然后底层这个GM当中,我们去提供它,呃,具体的这个垃圾回收器。啊,那Oracle的话呢,也可以去提供,当然了,咱们现在主要用的基本上都是官方提供的,但并不意味着说这个第三方厂商就不能提供,那比如说咱们后边要讲的叫深圳do是吧?诶这个JC的话呢,其实整个性能呢也还是不错的,它呢就是这个红帽公司这个主要推出来的。
01:06
啊,当然我们也知道啊,这个红帽公司推出的,毕竟不是Oracle官方推出的,所以这个应该说呢,Oracle还是比较排挤他的啊Oracle呢对应的提供了一个叫做ZJC是吧?诶大家如果关注这个JC这个发展的话呢,应该知道这个ZJC啊行,那这呢就是能够说明这个问题,就是说咱们呃规范当中没有明确说说你一定要用哪个啊,就是Java语言之所以有生命力呢,还是因为它是比较开放包容的,对吧?诶包括这个世界啊,经济也是一样子的啊,诶只有你开放包容的话呢,诶才能更有活力啊,更有活力一些,行,那再比如说的话,就好比是呃咱们国家呢,定了一个政策,就是关于房地产这块呢,这个政府说了,呃中央政府说说房子呢,是用来住的,哎不是用来炒的,哎不是用来投资的,诶那这样一个概念下去之后的话呢,这其实就好比是一个规范,那么在不同的这个省份的话呢,呃,根据这个政策,根据这样一个标准,然后他们去落实具体的一些规则啊,因为有的这个省市啊,比如说像北京啊,深圳啊,广州啊,包括。
02:06
上海是吧,这种一线城市的这个房价呢,实际上是偏高的,而且呢,你一不小心这个房价就蹭蹭的往上涨,那这个当地的政府就得想办法呢,去压低这个房价。比如这个贷款的话呢,要求你这个利率更高是吧?啊你要是二套的话呢,这个这个首付呢就更高,等等这样一些措施呢,防止你去炒啊,这是对于一线城市来讲,但是你要对于这种二三线城市来讲的话呢,这个人口相对比较少,那你要说这个不去鼓励大家去买房子的话呢,那这个房价呢,可能就不断的往下跌。对吧?诶我记得去年还是前年的时候,黑龙江哪个城市说那个房价的话呢,都可以一块钱去买是吧,很夸张哈,嗯,就是非常非常便宜了啊,因为大家不买嘛,所以这时候你反而要刺激啊,这呢就是不同的省市呢不一样啊,实际上咱们国家比较大,对吧?诶就这样个原因啊,就是规范中呢,没有明确指明说我们应该用哪个垃圾回收器,这呢由具体的厂商呢去实现啊,下个呢说由于GDK这个版本啊,处于高速的迭代过程当中,因此呢,Java发展至今呢,已经衍生出来了叫众多的一个GC版本。
03:08
嗯,这个大家能理解吧,就是咱们这个JDK的话呢,我们知道从这个九啊,Java从九开始的话呢,每隔半年它是不是就要发布一个新的版本啊。啊,每隔半年就要发布一个新的版本,那它呢,处于这个高速的迭代过程当中,那么诶,咱们其实大家如果你要关注这个GDP版本这个新特性的话呢,你会发现啊,在每一个版本当中都会提到关于这个JC这块的一些变化啊,乃至时候呢,仅仅是一个优化啊,都有可能。啊,不知道大家呢,之前有没有关注啊,因为这个版本现在迭代速度很快啊,有没有去关注咱们这个,呃,Java这个不同版本这个新特性啊,诶这个我在这稍微给大家可以有这样一个小技巧的一个说明哈,诶不同。诶版本的这个呃,新特性大家呢,从这个哪几个角度去看呢?诶我这呢,可以给大家一个小的一个建议哈,呃,因为呢,这个从Java吧以后的不同版本这个心得性,因为它发布时间很快哈,每次发布的时候呢,我也都会录一个视频,大家呢,也可以去商务的官网啊,鼓励学院上或者哔哩哔哩上去找啊,都可以找得到的哈,嗯,行,那么关于这个Java不同版本这个新特性的话呢,大家可以从三个角度呢去看啊哎去学习,那第一个角度话呢,可以称为呢叫做语法层面啊。
04:22
诶诶层层面是吧,诶第一个呢,称为这个叫语法层面啊,比如说呢,呃,像这个拉姆达表达式。哎,像这个拉姆达表达式,哎,包括呢,像这个新特性里边这个Switch表达式,哎,不知道大家有没有听说过啊,还有呢,像以前我们这个新特性当中叫自动装箱拆箱。自动的拆箱。嗯,还有呢,比如说我们像这个印尼的关键字,包括呢,像我们这个泛型。哎,包括呢,像这个在接口当中,我们可以去定义这个呃,叫静态方法,默认方法,包括这个私有方法等等是吧?这呢都属于这叫语法层面的一些变化,那对于这个语法层面的变化呢,那就是大家呢,你需要呢,自己呢去练去熟悉啊,因为以前没有用过嘛,对吧?诶真的你就需要去熟悉,这是第一个角度啊,这个呢,也是大家需要去关注的一个角度啊,然后第二个角度的话,我们就称为呢,叫这个API层面的一个变化啊。
05:18
那API层面变化是什么意思啊,就是我们会看到呢,语法没有什么变化,或者语法变化之外呢,会有相关的一些新的API的一些加入,呃,以及呢,一些旧的一些API呢,被depreated乃至说呢被移除啊那这样的一些层面的变化,那比如说呢,呃,咱们在这个JAVA8当中,大家呢,会都知道有这个叫是不是stream API啊对吧?包括呢,我们说还有这个叫新的呃日期呃时间的这个API,包括呢,还有这个叫optional类,还不知道大家有没有在开发中用过哈,当然主要这个optional这一类的话呢,我们还是在这个string API当中,咱们用的呢,是相对来说要多一些,对吧?啊还比如说呢,像这个关于string。啊,包括呢,像这个叫做集合框架。
06:00
啊,由于呢,我们接口当中呢,可以去定义一些叫默认方法和静态方法啊,我们在这个集合框架当中会看到这个静态方法和默认方法的一些加入,对吧?那string的话呢,底层也会给你去优化一些方法啊,包括呢,我们知道这个string的底层是不是在这个JAVA8中,或者之前我们都开始差赢数组啊,JAVA9以后呢,改成这个叫BAT数组了,对吧?诶这呢都属于叫API层的变化,诶那这块呢,大家也需要去关注一下,因为呢,通常加入的这API呢,对我们实际开发中肯定是有帮助的嘛。对吧,哎,旧的那些不常用的呢,我们可能就删掉了啊这呢是这样一个调整,那么第三个调整呢,想跟大家说呢,就是关于这个叫底层的一个优化,哎,叫底层优化,那么底层优化呢,通常我们涉及到叫啊GM的这个优化,那涉及到哪些方面呢?呃,这个。呃,主要呢,就是涉及到我们这叫JC是吧?诶JC的一个变化啊,JC的一个变化,包括呢,我们这个GM呢,还可以去支持其他更多的语言,像涉及到比如说呃,以前呢,叫reno啊reno是吧,这样的一个GS的一个引擎,那后来的话呢,还有其他的一个引擎的一些加入啊,这个大家可以去关注一下啊行,呃,那么JC的话呢,大家会发现呢,在每一个GDP版本当中,其实都会提到这个JC,哪怕呢,它不是引入新的JC,呃,这个JC的话呢,它也会对原有的这个JC呢进行一些变化,诶不妨呢,大家你看一看历代版本,你就会发现呢,确实是这样子的。
07:21
啊,确是这样子的啊,包括呢,还有我们像讲这个,呃,JDK7JD8那块呢,涉及到一些变化,比如说像这个圆空间的一个引入是吧?啊为什么我们要引入源空间是吧?这都算底层的一些优化层面的哈,包括呢,还有这个像这个咱们提到这个静态域啊,还有这个字符串常量池,它位置的一个变化等等是吧?这些呢,都可以看成叫底层的一个优化。诶,这块呢,是大家可以去关注的,就是以后的话呢,再出这个新版本,大家呢,你就可以从这样三个角度,你去关注一下这个版本里边都有哪些新的东西啊,有一些呢,细枝末节呢,你可以就不用过多的去关注了,OK,那么关于这个底层优化这块的话呢,大家也能看到话,就是说Java语言啊,对于Oracle来讲的话呢,还是希望呢,他不断的去迎合这样时代的一个变化啊,不管是语法层面上,我们让它更轻量级也好,还是说希望我们这个Java语言更快也好,啊是希望的话呢,他不断的哎去有迸发出这个新的生命力,是吧?从这个角度讲的话呢,大家也不用特别去担心,说有一天这个Java呢,是不是说一夜之间就会被其他语言所替代掉啊,这个呢,其实不会的啊,这个你不用太担太担心啊,之前有同学会担心这个Python是吧,能把这个Java给顶替掉,那其实呢,也不会是吧。
08:32
哎,那包括构语言也是一样啊,大家呢,各自有各自的一些应用场景啊,而且呢,时至今日的话呢,也不是说一个语言呢,他就呃自己呢就独霸一方啊,它其实呢,很多语言都是交互在一起使用的啊,你去公司当中任何一个呢,资历稍微老一点的成序员,他不是说只会一门语言的啊,OK,这个说的有点多了啊,咱们再拉回来,呃,那么通过刚才这样一个说明的话呢,大家知道我们在每一个GD版本当中都会涉及到底层的一些JC方面的优化,所以说的话呢,也会衍生出众多的这个JC的版本,OK,那么从不同的角度呢,我们来看一看这个垃圾收集器啊,这个呢,大家做一个了解就行,你没必要呢样去记了啊,就跟我们说这个人一样,你可以通过这个男人女人啊,就通过性别呢区分是吧,也可以通过年龄分,还可以通过肤色分,还可以通过这个,呃,说的这个语言来分,对吧?哎,有很多种分配方式啊,通过身高分体重分那都可以行,那么由于这个垃圾回收器比较多呢,我们从几个不同的角度来分,首先的话呢,我们是按照这个线程数来分。
09:29
按照线程数,注意这里边儿我指的线程数啊,主要说的是我们垃圾回收的这个线程数。就是用于垃圾回收的这个线程数啊,这儿呢,我们自然而然的就分成叫串行垃圾回收器和并行垃圾回收器,咱们在上一章当中讲过这个并行与并发的垃圾回收器的概念,对吧?哎,这个呢,其实就一脉相承的了,那么这里边这个红色啊,哎,这个准确说应该叫橙色啊,这个橙色的话呢,它就是一个垃圾回收的线程。啊,这这个这个这叫什么绿色青色是吧?这个呢,就属于用户线程啊用户线程,那如果呢,我们在回收过程当中啊,只有一个线垃圾回收线程,这个呢,咱就称为呢,叫做串行垃圾回收器,那如果呢,你要是有多个垃圾回收器呢,并行的去执行是吧?那这呢,我们就称为叫并行垃圾回收器啊非常的好理解啊,那对应的话呢,我们说这个串行垃圾回收器呢,它实际上呢,是不是只有一个CPU的时候呢,我们用的就是它。
10:19
能理解对吧,那么什么场景下我们适合用这个叫创新这个回收器呢?那很显然就是对于我们这个硬件平台,它的这个硬件的这个配置是不是比较低的时候啊。啊,像单CPU的时候,我们就适合呢,使用叫串行回收器。啊穿越回收器,而且呢,它的性能表现呢,还是不错的啊,它的性能表现还是不错的,那如果说你在这种单吸收U的这种场景下呢,呃,大家如果使用这种并行的垃圾回收器,其实你会发现呢,其实效果并不好啊,当然这个所谓的并行也不可能,咱只能说要并发了啊啊因为呢,只有一个CPU嘛啊只能大家交替的去执行,那反而的话呢,更慢啊,因为呢,你还需要有个切换的时间,对吧?啊就是在并发能力比较强的CPU上呢,我们用并行的会更好啊,当然呢,你要是只有一个单CPU的话呢,嗯,这个呢,你要是用这种这个这个所谓的并行的这个,哎,反而呢效果更差啊,所以呢,这个串行的回收器呢,它默认的在客户端的这个client模式下呢,这个GM当中去使用,诶咱们前面讲过这个client模式是吧,32位操作系统的时候呢,我们可以去选择client模式和server模式。
11:23
诶,对于咱们64位的操作系统,咱们用的是不是都是这个叫server模式啊,你看Java-version看这呢,咱们看到是不是都是server模式啊,因为呢,咱们是64位的这个操作系统啊,接着的话呢,咱们是64位的这个JDK啊,当然主要还是看这个JDK的一个版本啊。好,这个呢,就我们说的这个意思。啊,这呢,就是说这个你要是单个CPU。嗯,单个CPU的话呢,你要是用这种并行的,反而这个更差一些是吧,那么一个共性的话呢,就是不管你是呃这个串行也好,还是这个并行也好啊,这呢,我们都涉及到叫stop the word啊,都是stop the word啊,就是它是会结束用户的线程啊,OK,然后下一个分配这个模式的话呢,我们叫做这个按照工作模式来分。
12:07
工作模式分成呢,叫并发式垃圾回收和独占式垃圾回收。诶独占式,那前面咱们其实也提到过这个并发的概念啊,独占式的话呢,就是它只进行垃圾回收,别的用户线程都不允许执行,实际上呢,就是我们所谓的叫stop the word这个时间对吧,在这个时间段之内呢,我们进行这个独占式的垃圾回收。啊,那么什么叫并发呢?啊,那像我们后边讲这个CMS呢,就是第一款并发式这个垃圾回收器,所谓的并发的话呢,叫concurrent,我们呢,可以使这个用户线程和这个垃圾回收线程他们可以同时的去执行。哎,可以同时的去执行,那么同时执行呢,自然而然的,我们是不是就提高了程序的一个叫延迟性啊。哎,不能叫提高延迟性,应该叫减小了它的这个延迟性是吧,或者我们叫这个提高了响应的一个速度。啊,响应的速度就是你在这个时间段之内呢,我们说用户线程不能执行,让用户感觉呢,是不是有点卡似的是吧,而这块儿的话,用户线程始终都在执行啊,所以呢,这个延迟的这个时间呢,就短了啊OK,那这呢是按照这个工作模式来分啊接着再往下看。
13:13
那如果说按照这个碎片处理的方式来分,可以分成呢,叫做压缩式的垃圾回收器和非压缩式的垃圾回收器。啊,这个词呢,可能大家诶感觉突然有点陌生啊,那咱们前面呢,是不是讲过叫标记啊标哎想想写英文哈,哎这个标记我们叫mark,然后呢,那个我们叫comp是吧?哎这个comp的话呢,这块它不是翻译成就叫做一个压缩或者叫做整理吗?咱们前面讲过叫哎标记整理算法,哎这个整理或者叫压缩算法就是指的是这个事。啊UIG呢,就是在我们进行这个垃圾回收完以后,是不是要会要会对这个内存空间啊,进行一个呃,碎片化的一个整理。啊,就是按照这个呢来进行一个区分,这个呢,主要还是看你底层是不是用什么呢,什么样的这个回收算法了,对吧?啊这个要注意哈,那大家也回忆一下我们前面讲过的一个点说呢,如果咱们要是内存这个就垃圾回收完以后呢,我们进行一个碎片整理了,那就意味着我们这个是不是,呃,有数据的在上边儿,没有数据的不是空闲的都在下边,就是内存是比较规整的,对吧?那这时候呢,如果我们要再分配新的对象呢,是不是就从下边这块去分了。
14:20
咱们说当时用的什么方式啊。还记得吗?哎,我在这块写一下吧,咱们这时候呢,是不是再分配这个对象的话呢,哎,再分配。哎,对象空间,哎,我们说呢,哎是不是使用了叫指针碰撞啊。是吧,哎,叫做指针碰撞的方式啊,那对于我们这种没有进行过,哎这个内存整理的这个方式来讲,我们要是在这个分配对象空间的话呢,咱们使用的叫什么呀,是不是叫空间列表啊,哎,咱们需要额外的维护一个列表。啊,这呢是咱们前面讲过的这个内容啊,这个大家再稍微回忆一下啊。行,然后再接下来的话呢,说如果按照这个工作的一个内存空间来分啊,这儿呢,就主要针对于咱们堆空间呢,分成叫年轻袋和老年袋,所以呢,我们专门会分成专门来回收这个年轻袋的垃圾回收器和专门回收老年代垃圾回收器,那这儿呢,是按照这个工作的内存区间来分的,行,那这呢,就是咱们把这个垃圾回收器呢,按不同的角度呢,做了一个分类啊,通过这个呢,大家也能知道啊,咱们垃圾回收器呢,它面对的一些场景是什么样子的,OK,这个呢,大家先做一个啊理解啊,不用死记硬背啊,理解就可以。
我来说两句