00:00
大家好,我是讲师宋洪康,咱们接着来看下边这个章杰,前面的话呢,咱们讲了class文件结构,以及呢,叫自解码指令集与解析举例,那接下来我们再要讲就开始第三章,那咱们讲这个时候呢,咱们还是回过来呢,先带着大家呢,来看一下咱们GM的这个整体的结构,咱们说这个学习啊,应该有一个这样的思维方式,就是一方面呢,叫做小处着手,比如说咱们深入到一个一个的自解码指令上,一个呢去一个一个的去分析,对吧?那另外呢,还要大幅找引,就是我们要时不时的抬起头来看一看,现在我们讲到哪儿了,这个内容呢,重要不重要,前后呢,又跟哪些知识点去搭配使用的,对吧?那下边呢,我们再来看一下整体这个结构。第一章和第二章呢,咱们重心呢,实际上呢,都处在这个位置啊,第一章呢,主要说这个class文件的结构啊,分成了具体的几个部分,我们一个字节一个字节的去带着大家剖析的,那么第二章呢,我们主要解决的问题是什么呢?就针对于我们说这个方法,每个类中的这个方法呢,它有具体的这个方法起对吧?那方法起的这个相关操作呢,我们就封装在你这个方法的这个扣得属性当中,那扣的属性当中呢,我们看的话呢,就是一个一个的自解码指令,那我们主要呢,就是分类别去讲解这些具体的自解码指令。
01:18
这呢就是咱们前两章的这个内容,那严格上来讲呢,这个字解码这一块,实际上不算是咱们GVM的这个部分。那因为呢,咱们这个GM呢,就从这个类的加载器开始去加载你这个class文件开始的,后续这一块才算是咱们这个Java虚拟机的这个体系,对吧,但是呢,我们又不得不去讲这个磁金码文件那一方面呢,就是我们再去看这个官方这个规范的时候。GM官方规范的时候呢,他也会把这个这个资金码文件结构,包括呢,我们相关这个指令呢,融合进来,对吧,你看我们这个第四章专门这不讲class这个文件的一个格式嘛,然后第六章呢,咱们重点讲的不就是我们相关的这个字解码指令嘛。
02:05
那为什么非得要在这块讲呢?因为只有讲了这个之后,我们才知道呢,类台加载器如何才能加载这个合法的资金码文件,你要不按照指定那个规则去写的话呢,我们呃,Class呢,根本就识别不了,那这样的话呢,我们就不可能说把这个数据呢加载到咱们内存当中了,对吧?这呢是一个大前提。好,这呢是我们说的这个层面,然后另外一个角度来讲的话呢,就是咱们讲这个执行码文件呢,对咱们去熟悉这个一个具体的这个方法的执行的细节,咱们也说过好几次了,是非常有帮助的,对吧?行,那么通过这个前两章的学习啊,大家呢,你想一想,从理论上来看,咱们是不是可以做这样的事儿。比如说呢,我现在打开第二张随便呢,我找其中的一个程序啊,就比如说这个叫if Switch goto test,这呢是咱们之前写的这样的一个Java文件,对吧,这个Java文件呢,我们把它编译之后。Re comp是吧,编译之后呢,我们就会生成相应的这个自检码文件,咱们放到这个那al这块了,第二章。
03:08
是吧,一那在这儿呢,对吧,然后把它呢,比如我们这块CTRLC一下,我呢把它CTRLV粘到咱们这个桌面上,那现在呢,我们使用这个notepad加加呢给它打开。然后再呢,使用我们这个16进制呢,给它做一个呈现,这个呢,就是我们看到的一个一个的这个自检码,咱们第一章讲完之后呢,从理论上来讲,大家呢,就可以按照咱们讲这个class文件结构的这个格式一点点的去剖析,然后把它呢,是不是能够还原出来,还原出呢咱们class文件的一点点这个细节内部结构,对吧,类似于呢,咱们在这个。在idea当中这呢,使用一个叫Jack lab这样的一个插件,那我们看到就是这个结果,就是我们要第一张咱自己去做的话呢,是不是大家也可以做成这样的一个效果,只不过呢,时间可能会稍微长一点,对吧。这呢是咱们说的这个第一章,然后第二章的话呢,我们主要针对的,比如说我随便找个方法打开这个code之后呢,这就是这些字节码指令啊,这就是些自节码令,那我们呢,讲完第二章之后,大家呢,你通过第一章讲解,那至少可以翻译成这样这样的一个结构了啊,比如说我们在这个具体的这块呢,你能找到这个SWITCH1这个方法,然后具体那个指令呢,其实也能找到,只不过呢,像这个IO的下划线一。
04:22
我们还得看一下官方文档,这个I的强化线E呢,它对应的16进制呢叫EB,那我们其实在这里边呢,就能找到EB,那EB呢,你在对照着我们这个资金码指令这块呢,就翻译成了叫llo的强化性一了,那相当于比较慢,对吧,但是我们一定是可以翻译出具体的每一个方法的,这个这个相应的先后的执行的这个最起码指令是什么。啊,或者你叫这个朱基福也行,对吧,那么得到这个之后呢,那我们通过第二章的学习,咱们呢,是不是一点点的都分析过这样的一些资金码指令,大家其实也能做到呢,就是通过它呢,是不是再反推出来咱们对应的这个方法呀。比如刚才说那个SWITCH1,那不就在这儿吗。
05:01
那实际上是可以的,那言外之意呢,就是咱们通过前两章的讲解,扔给大家这样一个文件,只要这个文件是合法的,大家呢就能够翻译出来,或者我们叫反编译出来,对应的咱们这个Java的源代码。哎,从理论上我们是完全可以这样做的,只不过呢,这个费时间啊,有点像我们来破一个密码一样,是吧,看着呢就毫无规律,但是呢,我们最终呢,哎,能够呈现出来这样的一段代码。嗯,那我们在这个idea当中呢,大家针对这个自己化文件双击一打开,那这个呢,其实就是idea呢,帮我们这个反编译出来的这个呃,程序啊反编出来的,那大家可能会看到这里边细节上是不是还有点不同,比如说呢,我们在这个四位值三这块呢,写的都是字符串,嗯,然后在我们这块呢,你看到的是不是都是字符串,按照那个哈希扣的方法执行完以后的这个哈希值啊,那必要的话呢,我们自己呢,在知道它是字符串的情况下呢,你再反着推,然后得到这样的一个字符串啊当然这个事儿呢,其实是就就很困难了,对吧,这个事儿就很困难了,因为呢,不同的这个数,那我们可能变一变,然后它可能得到是同样的哈希值。
06:02
对吧,但是呢,你这个这个还一直呢。就就这意思啊,两个不同字符串有可能得到同一个含义值,但你现在往回推的话呢,想得出这个字符串,其实这个难度有点大,对吧,所以说整体上来讲,我们是能够推回去的,但是一些细节这些问题呢,我们可能是有点儿障碍。啊,有点障碍是吧?行,这呢就是咱们说这个前两章的这个情况,然后第三章呢,咱们现在要讲的就是开始进入咱们这个GM这个部分,这呢其实在咱们讲上天呢也提到过,就是有了这个4G码文件之后呢,我们看它如何加载到内存当中,这呢就涉及到我们这个呃类的一个生命周期,对吧。咱们这块书的这个类呢,呃,是这个以class这个名字,咱们可能过来说的啊,呃,真正在咱们这个成语当中啊,它不一定是个类,是不是,还有可能是这个接口对吧?还有可能是咱们说这个枚举类啊,那animal啊都行,包括呢,Annoation注解等等这些呢,都算是咱们Java中这个结构,那这些结构呢,只要是加载的话呢,我们都需要使用类的加载器。
07:00
啊,整个加载过程呢,我们称为呢,叫这个类的生命周期,对吧?那使用的这个类的加载器呢,也是我们要讲解的一个重心,在上篇呢,咱们其实讲解过,只不过呢,上篇很多细节呢,咱们没有展开,那在中篇里边呢,我们就细节呢再展开来说一说,那第三章啊,咱们重点要说的呢,就是呃,这个类的加载过程,那涉及到呢,叫类的生命周期啊,我们要讲的就是这个事儿。好,首先呢,来看一个概述。来我们看一下这个概述啊。这个现在说话的话呢,这个这几天上火,这个舌头尖呢起了一大块溃疡啊,所以这块在给大家讲这个视频的时候呢,这个每说一个词呢,这个舌头尖都得碰一下这个牙,呃,特别疼,这个现在这个脑门也是一头汗啊呃,这个就怕呢,发音也有不准的情况,大家呢,稍微的见谅一下。真的我尽量也克服一下啊,这个可能喝水少啊,上火了啊,嗯,我们看一下说这个在Java中啊,这个数据类型分成了叫基本数据类型和引用数据类型。
08:03
哎,那基本数据类型呢,是Java虚拟机预先定义好的,那引用数据类型呢,需要我们进行类的加载,所以这里边呢,我们说引用数据类型是不管有类的,那这里边类我们是一个泛称,或者叫一个统称,接口注解枚举类等等啊,我们都可以理解成它叫做类的一个加载啊,是这个意思。那么从这个Java虚拟规范上来看呢,自解码文件呢,加载到内存中,到它那被卸载为止,整个生命周期呢,我们说分成七个阶段,那就是对应下边的这七个阶段,那加载loading。验证verification,准备pre解析,然后初始化initialization啊,使用using卸载loading啊这呢一共是七个过程,那大家呢,这七个过程呢,刚才说完之后你要记下来。这个先后顺序呢,也绝对不能出错,绝对不能出错的,咱们后边呢,这一章展开呢,就是一个一个的来说这个细节。那你就像我们说人一样,对人呢,人的话呢,你就要出生对吧,出生呢有一个婴幼儿时期,呃,儿童时期,这个青少年时期,这个壮年时期,中年时期,老年时期,那就跟人一样,你不能把这个这个婴幼儿时期呢,跟这个中年时期你俩颠倒啊,这不合适了。
09:17
所以这块呢,大家记住这样的一个环节,那有的时候呢,我们说成是七个阶段,还可以呢,说成是五个阶段,因为呢,我们把这个验证准备和解析啊统称在一起,又可以称为呢,叫做linking,叫链接阶段,所以说这块呢,我这个章节划分的时候呢,就按照我们这五个阶段来说的loading link initialization,和using and loading这五个阶段,然后第二阶段链接呢,我们就分成三个具体的环节,验证准备和解析啊,这个大家呢,清楚这样一个过程。好,那这是我们说的这个生命周期的这几个环节,然后如果从这个类的使用过程上来看。比如说呢,我们现在程序当中要使用一个叫做hello word这个类,那要使用这个类,那我们需要确定呢,说这个类呢,是否已经加载过了,那我们说这类的加载呢,其实在内存中如果已经存在了,它就只加载一次。
10:06
啊,它就只加载一次,那如果我们现在呢,还没有加载过,那就是个no对吧,我们就需要使用它对应的类的加载器呢来进行加载。这个加载完以后,那我们就可以来执行下边这个环节,对吧?那如果说我们加载这个自解码文件的时候呢,它会做一些相应的验证操作,那如果发现你不是一个合法的资金码文件,这个我们也会抛出相关的一些error。啊,相关的一些这个错误信息,OK,那就加载不成了,那如果可以正常加载的话呢,我们向后边进行这个叫链接操作。那进行链接操作,具体细节呢,就是验证准备解析对吧,这样一些环节。好,那链接完以后呢,还有一个叫做初始化。初始化环节就是将我们这个类当中的一些静态的一些字段进行一个这个显示赋值,对吧,那链接环节呢,涉及到一个默认赋值,包括呢,对于我们符号引用改成直接引用啊,都在我们这个链接环节呢来实施。
11:01
那初始化完以后,到此为止,咱们这个类呢,就算是加载完了,最终的效果呢,它就会在我们整个这个内存的这个方法区,方法区是咱们说的一个范程,对吧,JDK8的时候呢,咱们就要圆空间了,这个方法区呢,就会存放一份当前这个类的一个模板。然后呢,接下来我们就可以去使用这个类了,典型的使用类呢,就是比如调用这个类中的静态方法,或者呢,我们去这个类的实例化,就创建这个类的对象,对吧?这样就是我们主要做的这个事情,调用你的这个实例的属性啊,或者是我们的这个非静态的方法呀,那都是属于这个类的使用环节,咱们平时开发的用的多的主要就是这个过程四对吧?对于过程一到三呢,咱们从这个程序员开发的角度来讲呢,我们很多时候呢,都忽略掉了,那这儿呢,过程123是咱们要讲解的中心,次呢就不过多去说了。最后呢,使用完以后,我们还可以进行类的一个卸载,那关于卸载这块呢,我们平时呢接触的又比较少,那这呢也是我们要讲的一个重点,就是恰好呢,是跟咱们作为一个程序员开发者来讲呢,是一个互补的,咱们现在呢讲的是123和五比较重,四呢比较薄,平时开发中呢,大家用的比较重的就是四。
12:11
好,那关于卸载这块呢,我们说有的类呢是卸载不了的,就是你GM呢,这个从GM的一个出生是吧,到GM的一个卸载,那我们这个类呢,才跟着呢出生和卸载。啊,就是说有一些类呢,是卸载不了的,那有一些类呢,我们说是可以卸载的,那这里边儿比如说我们这个hello word这个没方法,我们调完以后说这个hello word这个类就会卸载吗。不会的对吧,那这呢,我们说咱们讲垃圾回收的时候也提到过,我们也可以设置方法区的一个这个阈值,没有达到这个阈值的话呢,咱们也不会进行GC,那也不会去回收我们这个类,所以我们这个类呢,是可以在方法区呢进行一个缓存的。来进行一个缓存的。那如果我们再次要使用这个类的时候呢,我们就不用重新再加载一遍了,直接呢,还用你内存中这个加载好的这个类就可以了,这个从效率上来讲呢,也会更高一些,对吧?好这呢,就我们说的整个这个加载的过程,大家呢,要熟悉啊,比较简单啊,要熟悉那这一章呢,在这个大厂这块呢,也有相关的一些面人题,这儿呢,我就列举出来咱们国内的几个顶级的这个互联网公司。
13:16
嗯,一说到顶级互联网公司,大家现在还会这个说到这个B吗。BAT我们叫的比较溜了,实际上现在已经变成at了是吧,百度呢,现在是严格的掉队啊BABAT下边呢,嗯,或者说叫ATT下边呢,现在还有这个TMD啥的,对吧?啊,其实这块也不止TMD了,还有其他的一个一些相关领域的这个九霸的公司啊,头条啊,美团啊,滴滴啊,这是比较典型的三个公司,那像这里边儿这个头条现在也是啊,非常的这个叫什么,士气非常盛是吧?美团呢,也是一样,那前两天的话呢,这个美团呢,改名了。那原来呢,他不是跟大众点评合并在一起,叫做美团点评是吧,那现在呢,改名成就叫美团了,很多人呢,就开始议论是吧,这个美团呢,现在已经有这个万亿这个人民币的这个市值了啊,这个很厉害,那头条的话呢,现在也是包括跟美国现在关于TK talk还在打官司啊,美国在耍流氓啊,这个百度的话呢,现在。
14:08
严格校队啊,现在在这个行业里边呢,都把百度看做什么呢?叫做互联网界的黄埔军校。啊蒙一听呢,感觉像是表扬他,那其实呢是一个贬义词,那我们知道黄埔军校是学校,学校是干什么的呢?是不是培养人才的呀,那就相当于是百度呢,给这个其他的这些,尤其像TM这TMD这些公司提供了大量的这互联网的人才,那尤其那要说明的就是头条,头条呢抽血抽这个百度抽的非常惨,非常啊,大量的人才呢,外流到这个头条里边。啊,AI相关的,算法相关的,搜索相关的是吧?哎,都流向过来了,百度呢,相当于是这个不知不觉就掉队了,啊这个确实现在这个做的不好是吧,所以有的时候呢,我们看这些公司吧,你会觉得此一时彼一时,当年强盛的时候呢,这个百度掀起,后来腾讯起来了,当时阿里巴巴还很弱小,那现在阿里的话呢,也是个巨无霸,这个蚂蚁金服还没上市,那一上市呢,阿里整个企业的市值又非常高,对吧。
15:04
他们是一个体系嘛,那百度呢,当年也是不可一世,那当年的我印象比较深,当年好像百度达到300亿的时候呢,美团可能只有1.3个亿,连人家一个零头都不到,那现在的话呢,完全反过来,这个那个美团的话呢,现在应该现在应该能能值四个百度吧,差不多啊,能值四个百度。此一时彼一时,那其实人也是一样,对吧?当然呢,就是找准方向之后呢,不断的去努力啊,当然你也得看看这个大方向,所以呢,你感觉曾经你厉害的那些人,看不起的那些人,那明天是什么样子,不好说,不一定啊,同时呢,你也不要低估你身边那些非常努力的,今天不如你的那些人啊,你也要善待他们,对吧,那可能有一天的话呢,人家也可能是不是走的会更高更长远一些,对吧。OK,行,这呢,就我们说的第一个叫概述,然后接下来的话呢,我们就具体展开这些环节呢,带着大家讲一讲。
我来说两句