00:00
大家好,我是商务的讲师宋洪康,那么从现在开始呢,我们接着来录制咱们的GVM的这个视频啊,那前一部分视频呢,在之前的发布之后呢,后续的视频呢,没有按原来这个节奏呢及时的发布啊,很多同学呢,在网上也是在催促哈,主要原因呢,是由于这个呃,疫情的影响啊,我这块呢开始线上授课了,所以呢,就耽误了咱们关于这个GM这套视频的一个更新啊,不过没有关系,线上这个课程呢,我已经告一段落了,诶咱们又可以接下来给大家录制这个GM的这个视频了啊,那么后续的这个视频呢,我们都按照这个如期的这个节奏呢进行发布,甚至呢,我们这个节奏呢,还要更快一些。好,那么回顾一下啊,咱们前面呢,讲了其中一部分关于GMGM的这个视频了,那整个呢,给大家要讲解的这个GM的内容的话呢,我们包括这样的几个篇章,首先的话呢,叫做内存与垃圾回收篇,然后自检码与类的加载篇啊,性能监控与调篇,那其实呢,这三张三个篇章之后呢,整个我们关于GM的内容呢,就已经算是完整的,那最后的话呢,我们再通过这个大厂面试题的角度啊,咱们再把前边这些内容呢,再重新的以面试面试者的一个,呃,这个这个企业面试的一个角度呢,我们给大家呢再做一个整合。
01:10
啊,针对呢,就是急需面试的同学,包括呢,这个在这个企业当中已经有相关的开发经历的同学啊,那么可以更多的把精力关注到这个大场面试题方面,那么前面这块的话呢,除了啊这个我们讲解的针对大厂面试题方面的内容之外呢,我们讲解的整体来说还是非常的细致的啊行,那么我们之前的话呢,是讲到了关于内存与垃圾回收篇当中的,哎,前七章啊,也就是这样一些章节。好,那首先的话呢,我们做一个回顾啊,那么回顾的话呢,我们先要说清楚,就是为什么我们要分成这样的三个篇章,大家呢,是如何理解的。行,那这儿呢,还是来看咱们这个,诶我画的这些图,那这个图的话呢,我们看这张图。看这张图就是大家呢,在网上肯定关于这个GM,如果呢是Java的程序员啊,当然呢,我们说这个Java虚拟机不光是针对于Java应用程序了啊,当然呢,我们更多的呢,还是在Java虚拟机中运行的是Java程序,所以说呢,对于Java程序员来讲呢,可能更多的呢,诶我们在面试的中啊,面试当中尤其呢是高级程序员架构师GM呢是必问的项,而且呢,这个面试的比例呢,还是比较高的,哎,那大家呢,可谓可能呢,会在网上呢,去搜索相关的GM的这个教材或者是书,对吧?哎,那打开以后的话呢,这里边儿有很多的关于GM这个相关的一些这个内容,诶大家呢,可以去买这些书呢去看,那通常的话呢,这些书一般呢,都是针对于其中的某一方面来讲的。
02:35
针对其中的某一方面来讲的,相对来说比较系统全面的话呢,那就是周志明老师录的这个深入理解Java逊机也是呢,跟我们说官方的扎va逊尼规范啊,最契合的这样一本书,这本书呢,在前段时间呢,也出了这个第三档。啊,是这样的一个情况啊,那么有兴趣的同学呢,可以看一看,当然呢,这本书呢,对于接触扎虚尼比较少的同学来说呢,看起来是比较枯燥难懂的啊,是这种啊,那么除了这本书之外呢,还有很多其他的关于扎瓦逊尼的书,那么一般情况下呢,这些书都只是关于其中的某一方面。
03:07
啊,某一方面,那么咱们这道视频呢,相对来说录制呢,就比较全面了啊,那么大家来看啊,我这呢,提前是把这个图已经画好了,咱们来说这个咱们学习GM的最终目的呢,肯定是为了在系统当中,当我们的系统遇到瓶颈的时候呢,我们考虑如何解决系统的瓶颈,除了呢,我们去扩充硬件之外呢,我们要考虑在软件层面如何去提升这个系统的性能,对吧?哎,也就是我们学习GM的最终目的呢,一定是为了生产实践进行性能调优来说的。那么要想能够实现性能的调优,你得具备相关的工具呢,去监控程序的性能,那这呢,我们就自然而然的引出来了,叫性能监控的工具,那我们到时候呢也会讲,比如说有这个命令航品也有呢,涉及到一些可视化工具。啊OK,这呢就涉及到我们叫性能监控,有了监控我们才能够针对于监控的这些信息反馈,我们做相关的性能的提升,这两块呢,就是我们要讲的这个叫下篇。
04:08
啊,就是我们这个第三啊叫性能监控与调片,OK,那么要想大家看这个,比如说可视化工具,你得能够看得懂这里边儿的这些数据啊,比如说我们提到这个呃,堆空间啊,涉及到这个垃圾回收算法,垃圾回收器,那你得能够懂这些内容,对吧,那这时候呢,我们就需要呢,再基于内存的分配和回收啊这个知识点,大家呢,才能够去正常的去使用,或者看得懂性能监控的相关工具反馈给我们的这些数据。OK,那么内存的分配与回收,这就涉及到了我们相关的垃圾回收算法啊,包括呢,对应的一些垃圾回收器,垃圾回收器呢,我们还有相关的很多的一个指标去衡量他们各自的这个性能,对吧?这呢就涉及到垃圾回收这个角度了,那么要想大家能够去懂这个内存的分配呢的前提呢,是你得懂内存的结构。
05:00
很自然而然的问题,对吧?哎,我们什么样的数据啊,比如说我们去创建对象,然后进行相关一系列的方法的调用,属性的调用这样的一些操作,那么在内存当中,我们是如何分配这些相关的变量,这些结构的,所以我们先得懂,就是在你懂这个内存的分配之前呢,你先得懂GM呢,内存是怎么给我们划分的,所以呢,我们,哎就要学的叫内存的结构,那么这个内存的结构,内存的分配与回收这两部分呢,对应的就是咱们要讲的这个上篇。诶对应的就是咱们这个上片啊,好,那么我们接着来看,那要想大家能够更好的去理解这个内存的结构,就好比是咱们一开始讲课的时候呢,带着大家看的这个大一点的这个图,对吧,那我们主要呢,诶考虑的就是数据的一个分配啊,回收啊,主要针对的就是我们这里要讲的叫运行时数据区。这个问题对吧?好,那么要想大家呢,对这个内存的结构呢,有一个更好的理解,那需要怎么着呢,我这儿呢,又列出来了三块内容,第一个呢,叫做类的加载器。
06:01
啊,因为呢,我们知道这个数据呢,把它放在内存当中的话呢,是不是都要使用类的加载器进行一个类的加载啊。对吧,哎,我们要拗个对象,你前提呢,也得是有构造器,构造器要想有也得先加载类,对吧?那加载类的话呢,我们还涉及到加载类的副类啊,这就是相关的一些这个内容,那么我们就要用到这个类的加载器啊,就是这部分内容包括呢类的加载过程,OK这样的一些细节,这呢就统称为叫类的加载器这块知识点,OK,那么除了这之外的话呢,诶,我们说类加载器帮我们把数据呢加载到内存中以后,我们要想让这个数据呢进行个执行,这呢毫无疑问我们需要用到呢,叫做执行引擎execution engine。啊执行引擎,那对于Java来讲,Java的执行引擎呢,有哎两部分,一部分呢叫做解释器啊,一部分呢叫做即时编译器,那这两部分的这个特点是什么?哎,他们之间是一个协作关系,还是一个竞争关系等等这呢,等咱们讲到这个执行引擎的时候呢,咱们再说,也就是说呢,执行引擎,哎帮我们呢去执行,哎咱们这个内存中的这个数据啊把它把它呢,翻译成相关的这个机器指令给到我们这个CPU去执行。
07:09
这呢就提到了,我们这叫执行引擎啊,这个你得懂对吧,就是怎么让我们这个程序的去执行的,GM当中呢,有一部分结构呢,叫做执行引擎,那这个呢,哎对应的在哪呢?在咱们这个内存与垃圾回收片,哎打开以后呢,在咱们这个后边在这儿是吧?讲这个叫执行引擎,OK行,那么还有一部分呢,叫做class文件结构。那这个是什么情况呢?咱们知道咱们要想把这个数据呢,给它加载到内存中,咱们使用的叫类的加载器,那类的加载器它可以相当成一个机器了,它的产出呢,你可以理解成就是把这个数据呢,给我们铺到这个内存层面啊,那么它得有原材料,那这里所谓的原材料呢,就是我们所说的叫class files,也就是自解码文件。对吧?哎,自加码文件我们使用类的加载器加载到运行时数据区,然后呢,执行引擎帮我们去做运算啊,在这个跟底层这个CPU是吧,做一个交互,哎做运算的一个结果,得到我们想象的一个情况,哎就是这样一个层面,所以说呢,要想大家能够更好的去理解这个内存中啊一些数据的一些分配位置啊,它的一些执行过程啊,我们需要知道呢,自解码文件里边它是怎么写的,所以说呢,我们哎也要关注的另外一个点就是class文件结构。
08:22
啊,这个呢,对应的就是咱们这个中篇,诶要讲的字节码和类的加载篇,包括这块我们重心的是讲字节码,包括自节码指令,那同时的话呢,咱们呃,顺带呢,再把这个类的加载篇呢,再讲一讲。啊,再讲讲啊,因为有一些内容,咱们在这个,诶第一部分,哎,这这的时候呢,其实咱们讲了一部分关于这个类的加驶器,对吧?啊类的加驶器我们已经讲过一部分了啊,当然还有一些内容呢,细节呢,我们没有说,为什么呢?因为这里边涉及到就是它们相互之间啊,是一种完全嵌套的关系。也就是说呢,咱们在讲这个内存结构的时候呢,咱这个或者说先说这吧,咱们讲这个类的加载器之前已经讲过一部分了啊,有些内容的话呢,我们还得需要用到后续的一些知识。
09:04
啊,比如说呢,咱们讲类的加载器,回顾一下啊,咱们已经讲过什么了,咱们是不是已经说过了,就是关于这个上边这一层呢,呃,类的加载器的分类啊,具体的由哪几种类的加载器啊,这呢,我们说重点呢,就是说两类,一类呢,就是系统像bootrap class loader啊引导类加载器,就是它是用C加加编写的是吧,CC加加编写的,属于我们GM的一部分,那除了这个不RI class之外呢,像excution class,扩展类加载器。应用程序类加载器,或者叫系统类加载器,包括我们自定义的类的加载器,他们呢,都是这个直接或间接的啊,继承于咱们的叫class。这个稍等啊,我点错一个按键。啊,不是打开它了啊,好一下啊,就是我们这个ECU class application class,包括我们自定义的这个class,他们呢,都是直接或间接的继承于这个叫class so了啊,我们的一个抽象类,那把这呢,我们都称为叫自定义的class so。
10:03
啊,用户自定义的是吧?呃,因为呢,它都是用Java代码来写的啊,这呢就是我们说的分的这两大类啊,那么具体的如何去自定义class order,包括呢,它内部当中的这个常见的方法,这个咱们是细节没有展开讲的,咱放到这个中篇的时候呢在讲,哎,这是其中的一个事儿,包括呢,我们说在这个类的加载器这块呢,涉及到一个叫双亲委派机制,大家还记得吧。哎,双亲。委派。派是吧?哎,双性委派机制啊,哎,这个细节呢,不用多说了,咱们前面已经讲过了啊,这个大家忘了呢,你再翻一翻咱们前面讲的这个视频,那么双亲委派机制呢,有没有打破?哎,双亲委外制的例子呢?这个在面试当中啊,就咱们所谓这个大厂里边也被问到过啊,那么大家呢,需要清楚这个打破的双亲委派机制的三个案例啊,这个到时候呢,都我们放在这个中篇里边去给大家做讲解。啊,也就是我们这个中篇是中篇呢,我们重点呢是在自解码这块,但是同时的话呢,跟C跟自解码交互的是属于类的加载器嘛,所以我们把这个类的加载器相关的一些细节问题我们再讲述一下,OK,这是其中的一个问题啊,那另外一个呢,就是说我们前面讲这个类的加载器的时候呢,提到过说分成三个过程对吧,叫loading啊,Linking和initialization啊,就是加载链接和初始化哎这样的三个环节,具体细节的话呢,我就不用多说了,咱们前面呢讲过了,那在这个当中的linking呢,我们又分成三个小的环节啊,Verify啊,验证,Prepare准备和resolve,这呢属于叫解析对吧?那么在解析环节呢,咱们其实是没有重点展展开,因为前面呢,我们提到过什么呀,说呢,解析环节我们就能够将这个对应的字解码的,这个叫符号引用,我们转化成对应的这个叫直接引用,那符号引用直接引用到底该怎么更好的去理解这个过程,哎,那我们讲了这个自己码文件的时候啊,尤其是常量池对吧?哎,我们再来谈这个符号引用。
11:56
符合直接引用的这个转换呢,大家会更清楚一些啊,也就是说呢,我们前面呢,讲了一些主要的内容,就是我们在讲这个。
12:04
上篇啊,一开始的时候,关于这个类的加载此系统的时候是吧,我们讲过一些核心内容,但是还有一些内容的话呢,我们没办法说透啊,因为呢,大家关于这个内存结构呢,还不了解,还不清楚,所以呢,我们没有讲透啊,当我们讲完这个内存结构以后啊,包括呢,直行引擎我们也讲完以后呢,咱们再讲这个中篇的时候,这个时候呢,咱们就可以再谈一些高级的问题。啊,再谈一些高级的问题,OK啊,就是这样一个情况啊,行这呢是我们说的这个,呃,相当于也算是一个复习了啊,那我们呢,在前面讲这个运行时数据区的时候呢,咱们讲过了,叫程序计数器。啊,还成语计数器或者叫PC寄存器对吧?哎,讲过了这个本地方法站啊,还讲过这个虚拟机站,这个虚拟机站的话,算咱们已有的讲的内存,呃,这个运营是数据区里边一个重要结构。啊,因为我们通常所说有句话叫站管运行,堆管存储吧。哎,对,有这样的两句话啊,那么所谓的战管运行呢,就是我们站里边呢,放的都是一个一个的,战争就是我这里边放的啊,Stack frame啊,那战争里边呢,我们主要的就放了几个结构,比如说呢,叫locals啊,本地方法站,本地方法表,本地这个变量表,或者叫局部变量表,对吧?啊,这个operation,嗯,Stas是吧,这个操作数站啊,包括呢,这个嗯,动态链接是吧,Dynamic linking,包括这个return。
13:26
Address是吧,返回值,地值啊,还有一些附加信息等等,这呢就是我们说的这个战帧里边的一个核心的结构啊,当然战争里边我们说最重要的就是局部变量表,或者叫本地变量表,以及呢,我们叫操作出站,哎这两个呢大家要清楚哎这两个结构呢,咱们在后续接触这个堆的时候,包括呢,咱们在接触这个资金码文件的时候,到时候呢,我们还会带着大家这个去分析是吧,包括呢,后续咱们还要讲这个叫叫什么优化是吧?诶性能优化的时候呢,我们有涉及到命令行等等,诶到那个时候呢,我们还会再接触到这个涉及到占,涉及到堆在内存中这个分配的这个过程啊,也就是说呢,整个咱们这个运行值数据区,对于咱们上品来讲,这一定是一个重心。
14:05
啊,整个大二虚拟机的话呢,咱们说这算是分成这个上层,上层就这块儿哈,这是中层,这是下层,呃,那么在上中下来讲的话呢,我们这个中层显然是最重要的,对吧?这呢是咱们中心啊好,这呢也算是一个复习,那么接下来呢,咱们就开始来接着咱们这个之前讲的这个内容呢,继续往下说啊那我们,诶上面呢,咱们已经讲到了这个第一章到第七章了,那接下来呢,咱们讲了一个非常重要的一个章节,叫做堆啊叫做堆这个章节好。
我来说两句