00:00
那第一张呢,我们就讲到这里,那下边呢,我们来看一下这个第二张啊,叫做类加载子系统,那讲第二张之前呢,咱们先来看一下这个内存图啊,还是来看一下这个内存图,这个图呢,是我画的一个简图啊,这个简图呢,跟我们上一张呢画的这个图是类似的啊,上一张那个图呢,我们是从呃网上找的一个这个比较通用性的一个图,大家看着比较呃眼熟一些啊,亲切一些,然后这呢,我是做了一个重绘,算是一个简图,那class文件呢,我们称为叫自检码文件,那从自检码文件开始,后续的这些操作呢,都是我们G这个GM所需要负责了,首先呢,我们需要做的事呢,就是把我们的class文件呢加载到内存当中,那加载需要用到的就是叫类加载此系统啊,Class load sub system,那由它呢来进行加载,然后生成到呃,对应到我们内存当中,呃,生成对大的class的对象啊,同时一些必要的像静态的属性呢,做一些初始化啊等等,主要呢是在这个方法区这块呢来。
01:00
体现它的一个作用啊,那么当我们真正去执行这个自解码指令的时候,那我们这个执行引擎呢,就开始发挥作用了,按照我们程序的这个自解码指令啊,依次呢去做执行,呃这里边呢,就涉及到了关于虚这个虚拟站里边,去这个局部变量表中去取数据,包括呢,还要去呃操作操作数站啊,以及呢,需要创建对象的话呢,就要用到我们的堆空间,那在这个过程当中呢,这个指定依次往下走的话呢,还需要用到程序记录器啊,如果需要调用本地的,呃这个C的类库的话呢,还需要本地方法站啊,这就我们叫运行时呃数据区,呃这呢是一个简图哈,那如果我们看一个稍微复杂一些的图,把它这个尽可能多的信息涵盖在里边,就是我们下面这一张图,这呢是一个英文版,这呢是一个中文版啊,这是不是还是非常到位的是吧?呃,大家刚开始学的时候呢,看英文有点呃恶心是吧,那这块呢,我们。
02:00
就给大家,呃,我给大家翻译了一下啊,做了一个中文版,看这呢,还是字有点小啊,嗯,直接来看我们这个我画图的这个位置。这呢是这个英文版的,嗯,那刚才呢,我们提到了叫class loader system,这呢也是咱们第二章主要要讲的这个内容啊,就是叫类加载器子系统啊,就它然后呢,我们简单看一下啊,这个自检码文件呢,我们进行一个加载的话呢,它又分成了三个具体的环节,第一个环节呢,就称为loading,叫加载,第二环节呢,叫做链接linking啊,第三个呢,Initialization啊,就是初始化,哎,分成三个环节,那么在加载这块呢,我们涉及到将自解码文件啊加载到内存中的话呢,我们需要用到类的加载器,呃,提到了典型的几类加载器,呃,引导类加载器,这个扩展类加载器,还有呢,呃,叫应用或者叫系统类加载器。啊这呢我们是几类加载器,当然呢,我们还可以自定义类的加载器啊这个咱们讲到这的时候呢,再说然后第二个环节呢,叫做linking,叫链接啊链接呢又分为验证准备和解析啊这样的三个环节,然后就是初始化啊,初始化这样的一个过程啊,涉及到静态变量的一个显示初始化这样的一个情况,那接下来呢,我们会将这个每一个自建码文件你要用到的哈,呃对应的在内存中,就把相应的这个类或者是接口呢就加载进来了啊加载进来以后呢,我们在内存层面呢,呃,运行时数据区需要看到的这个结构呢,有方法区,呃这个咱们这样来介绍吧,按照咱们讲的这个顺序啊,呃,首先呢是叫PCA寄存器啊,或者也叫做呃,这个程序计数器啊都可以,呃这呢是每一个线程一份啊,所以呢,有好多个线程,我这就放了好多份。
03:55
然后呢,我们涉及到一个比较重要的结构呢,叫做站啊,咱们平时所说的站呢,其实就是指的虚拟机站啊,就是这样的一个结构,呃,每一个线程一份,呃,这个每个线程用的站里边呢,一个一个的结构呢,称为叫战帧啊,Sta frame战帧,那战帧呢又分成很细节的一些内部结构,这呢,咱们讲虚拟机站的时候呢,都会展开来说,呃,Local variables叫局部变量表啊,也称为叫本地变量表,呃,Oper stack啊,操作数占呃,Dynamic,呃,Linking是吧,这个动态链接,还有return address啊,方法返回地址等等,这呢就是我们这个战争具体的这个细节了啊,每一个部分是什么作用,包括呢,在代码上的一个展示,咱们都会给大家演示啊,这呢是我们提到了具体的这个虚拟机站的情况,呃,然后还有这个叫呃,本地方法站啊,本地方法站主要跟站的一个虚拟基站的区别呢,就是涉及到本地方法接口API的一个调用的话呢,我们用的是叫本地法。
04:55
啊,专门拿出来一块,那另外一个非常重要的一个结构呢,就是称为叫诶堆区,哎,我们说堆区呢,主要是应对咱们呃创建Java对象的话,这些对象呢,我们主体都分配在这个堆空间当中,也是我们内存当中算是最大的一块空间了啊也是咱们JC呢重点要考虑的一块空间,因为呢,堆区是共享的啊,被多个线程所共享的,那方法区呢,主要是来存放我们的一些类的信息啊,这个一些常量,一些这个域信息啊,方法信息等等,我们涉及到这个方法区,那方法区的话,我们说只有housewa群息才有,针对于像g rocket或者是这个G9他们其实都没有的啊啊这呢是我们说叫呃运行时数据区,那刚才呢,我们也提到了这个执行引擎的一个情况啊,哎,它呢又分成解释器和即时编译器啊,包括垃圾回收器啊,都在我们这个执行引擎当中啊,跟将我们的这个。
05:55
啊指令啊,翻译成这个机器指令。诶供这个CPU呢去做一个执行,诶就是要想跟操作系统呢去打交道,我们需要,诶考虑到这个执行引擎,诶它的一个工作情况,诶这呢就是咱们这个简单的给大家梳理一下,呃,内存的这样一个结构啊,内存一个这样的结构,呃那下边呢,我这有一段话啊,说如果自己想手写一个Java虚拟机的话呢,主要考虑哪些结构呢?咱们在上一章讲解的时候呢,提过这个事儿哈,说如果大家想透彻的对虚拟机进行了解的话,那你就是自己手写一个,那刚才呢,我们提到了虚拟的这样一些具体的部分,那如果我们要是手写一个比较简单的虚拟机DEMO的话,我们主要考虑什么结构呢?呃,应该算有两块,一个呢叫呃类加载器系子系统啊,或叫类的加载器,另外一个呢,就是直行引擎,就这两块呢,是必须要考虑的。
06:47
啊,因为这个类的加载器子系统,咱们刚才也说了,呃,咱们通过它呢来获取类的这个信息啊,常量信息啊,变量信息啊,呃,方法的指令啊等等,然后呢,诶使它有组织的分配到我们的这个内存当中啊,那么这个执行引擎的话呢,诶,它需要呢,去逐逐条的去解释咱们的指令。
07:07
啊,那这时候呢,你必须呢,也要有这个执行引擎,所以这两块呢,是我们诶必须要考虑的啊,是这样一个情况啊行这呢就是我们做了这样的一个介绍,那么翻回来呢,我们看一下咱们下边要讲的这些章节哈,这样大家呢也心里有数,咱们第二章的话呢,就是来讲一下类加载器此系统,然后呢,从这个第三章一直到我们的,诶咱们到这儿吧。到第十章啊,把这个直接内存或者叫本地内存我也划过来了,这呢算是我们的呃叫运行时,呃,数据区啊,Runtime data area啊,运行时数据区这一部分要讲解的内容,然后呢,这个第11章的话呢,是咱们讲一下这个执行引擎啊,解释器,即时编译器啊这个情况,包括呢,我们说AOT啊,提前编译器都在这个执行引擎这块我们来讲解,然后后边呢,重点呃是基于我们面试的一个需要哈,包括呢,呃,其实这个Li table呢,我们可以看成是运行,是数据区这块我们来讲解的内容,这呢是单独成章啊,就是为了不打破上面的这个连贯性呢,我们放到第12章的位置了,面试中也长按问,所以单独呢给他出了一张,然后下边的第13到第16章呢,重点来介绍的,诶,就是我们说这个,诶垃圾回收。
08:19
哎,这块很重点的这个内容,哎,就是把咱们这个章节呢,再捋顺一下啊,大家学起来的话呢,不光能扎进去看具体的一个知识该怎么去,细节是什么样子的,同时呢,时不时应该抬起头来看一看,你现在走到哪了,未未来呢,还有哪些内容,哪些是重点呢,哪些呢,了解一下就可以啊,这个你得清楚,好这呢算是咱们的一个诶概述啊。
我来说两句