00:01
Hello,大家好,我是小石,然后又和大家见面了,今天呢,我们来聊一个高频的面试题,就是这个类的加载过程是怎样的,就是类的这个加载过程主要是分为五个。步骤就是一个加载链接,初始化使用和卸载,然后它每个步骤具体干了什么工作呢?我们今天就来具体分析一下啊。就第一个部分是加载,就是当我们使用一个类的时候,要通过class loader将这个类加载到内存中,就是class loader,这个内容我们在之前的视频中已经讲解过了,就类加载这个阶段主要主要完成如下三件事,就是第一个就是通过全类名获取类的二进制数据流,然后解析类的二进制,二进制流为方法区内的数据结构,然后在多中创建一个JAVA2点long.class类的实例,表示该类型作为访问方法区,这个类的作为方法区,这个类的访问入口大概就是这,大概就是这个样子的。
01:04
就是通过全类名获取类的二进制流的方式有很多种啊,就是第一个就是就是从Z包中,就是我们的价包中,或者从网络中还可以计算生成,如动态代理技术。对,就是然后的话,对于非速度类型的类型的加载阶段啊,我们既可以使用Java虚拟机内置的类加载器去完成,也可以使用用户自定义的类加载器去完成。然后接下来的一个阶段呢,就是一个链接的阶段,链接这个阶段呢,主要分为三个部分,这第一个就是准备。第一个就是验证准备解析,这个验证这个阶段呢,主要就是确保class文件的格式是正确的,就是运行时不会损害到虚拟的,呃,虚拟机的安全,就是它验证的规则有很多,大致分为如下四个阶段,就是文件格式验证,原数据验证,字节码验证,符号引用验证。
02:03
文件格式验证的话,就是它是否以魔术开头,或者是这个版本号,当前版本号是否在当前虚拟机接收范围内。另一个就是原数据验证,就是看他是否有原。是否有负类啊?或者是是否继承了final类的,对,后面就是这些具体的内容,就是很多具体详细的内容我就不解释了,你们可以去深入去去看那个深入理解Java虚拟结,就是本文是偏向于做一个总结,把握类加载的一个整体流程啊。准备这个阶段呢,就是主要是为类的静态变量分配内存,并将其初始化为默认值,你看就是常见的数据类型的默认值就是如下嘛,就是bit是零,Short也是零,然后你看就是。举个代码,举个例子,举个例子就是他。
03:04
对,他就是这样,他就是。将我们静态变量就是将这个值就是链,呃,链接阶段就是会将这个均的它赋为默认值吧,负为零,将它的值赋为零。不将它的值负为,将它值负为零,这个负为一的这个操作是在后面进行的,我们一会儿来分析啊。有一个特殊情况就是如果类的静态变量的字段属性表中存在constant value属性,那直接执行复制语句啊。直接执行赋值语句啊。就那么什么情况下就是类静态变量字段表中存在constant value属性呢?就是第一个就是类的静态变量为基本数据类型,并且被final修饰,第二个就是类的静态变量为string。类型,然后被final修正,并且以字面量的形式来进行复制啊,所以说就是我们得从自页码形式来看这个它是否有constant y6属性,所以我在IDA中下载了一个插件,就是B,然后你们可以下去下一下我们就用代码也通过自节码的形式验证一下啊,验证一下这个过程就是你看啊,就是我这边已经呃弄好了一个类。
04:19
弄好的一个类,然后我们下载完了的话。对,主要是先build一下这个类。对先,然后我们you收用这class看一下,我们来看它的field field的话,你看ages name local,嗯,这个就是你看它就有constant y属性,Constant y属性就是说是它在常量池,这个就是我们常量池嘛,就是它在常量池中已经定义了,可以找到它对应的值啊,你看这个我们点这边的话,这个就是常量,常量池的第12个属性啊,常量池的第12个属性项,然后它的值是。
05:05
它的值是这个二,这个是常量值的第16个属性,它的值是内嘛,我看二。啊对,这个是是这个值是160,这个值是。这个值是name。对,我们就看一看,那么一百六它就在这个阶段它被负为值了,然后剩下的这个阶段就是那A是零,A被负为零,然后这个呢,它是被ROC是被负为no的啊,那么它什么时候会把这两个值负负值呢。就我们接着往下看啊,就是它这个。下面一个阶段就是这个解析的阶段,我们看加载的阶段,链接这个验证的阶段,准备的阶段,我们都解解析完了,解析的阶段就是将类接口字段方法中的符号引用转为直接引用啊,这个是什么意思呢?你看就是从自解码的形式来看啊。
06:04
直接引用。转为符号引用。你看就是它这个,你看它这个就是就是说我们的话,假如说你看这个,嗯,你看这个。它的,呃,就是这个field,以field为例,你看它这个field的name是这个age嘛,但是它是常量池,它是它是在常量池中的第九项解析出来,它是一个A,但是这个A是一个字面量的形式啊,你看这个L就表示都是一个字面量的形式,它不是指向这指它不是指向真正的那个内存的地址啊,所以说在这个阶段呢,就需要。把这些字面量的描述啊,把这些字面量你看,那么它这个string类型字面量的描述来转为它指向目标类型的指针,就是它的直接引用,不是这些文本类型的描述符了,就是这个初始化过程,就是我们。
07:02
非常重要的一部分就是这个,它会执行类的静态成员变量的赋值语句和静态代码块中的语句啊。你看就是静态代码画中语句,我们以这个student为例啊,你看我们写了一个构造代码化静态代码块构造函数啊,我来看一看生成的字典码来看一下啊,就是student。对,你看他我们这里面只写了一个方法,你看只写了一个方法get name,但是它给我们却生成了,哎,就只写了两个,一个构造函数,一个get name方法,它给我就给我们生成了三个方法,就get name这个我们知道,那么这个in it和这个c CR in it这个是。这个是什么作用呢?我们就仔细看它的代码,我们先看这个CL,你看可以看,就是这个字编码的过程我就不详细解释了,我们就可大概就可以看出来,它执行了一个这个啥,就是输出了一个输出了一个静态代码块,然后呢给变量赋值,给均的这个变量赋值啊,你看给均的这个变量赋值,就可以看到这个代码,就是它这个给均的这个变量赋值为一。
08:21
然后并且执行这个静态代码块。所以我们就知道这个了啊,然后呢,我们来再看init这个方法,In这个方法的代码画这话你就可以看这个字节码,我们来看这个字节码是什么,就是它会它会显示的调用这个负类的in译的方法,然后会赋值你看负这个name,负这个age的。负这个我先看一下,这个是啊,对负这个H为十,然后再执行构造代码块,执行完构造代码块再执行这个构造函数啊,在执行这个构造函数就是age,负对H赋值,在执行构造代码化,在执行构造函数啊最开始的一部分是显示调用负类的。
09:06
Ne方法。理解了这个部分,我们就先来看一下这个啊,我们就来看啊。就是音译的方法的话,我们就看音译的方法的主要逻辑啊,就是调用负类音译的方法,非静态成员变量赋值,执行构造代码块,还有接着就是执行构造函数啊。CR in it的话就是一个这个CR in it的话就是这个,就是执行静态变量的复制语句,执行静态代码过程的语句啊,你说还有需要注意的一点,Java虚拟会保证子类的c re的方法执行前,父类的c re的方法已经执行完毕。我就是理解,为什么要理解这个c re的和音的方法呢?因为理解这个方法还是非常有必要的,因为我们在面试的时候经常被问到这些静态代码块构造函数。构造代码框这些执行的顺序啊,就是这些执行的顺序啊。
10:03
对,然后你可以就你可从自己码的层面,你就可以非常清晰的看出来,就是我就不说不演示了,就直接这边总结一下结论就是没有继承的情况下,它的执行顺序只会是执行顺序静态代码化,静态成像变量,执行顺序由编写顺序决定,就它这个只会执行一次,就是在类加载的时候执行一次啊,还有就是执行构造代码,执行代码块。哎,这个是执行啊执行嗯,啊对,我看一下这个是执啊对执上面是执行静态代码,这个是执行构造代码块和非静态成员变量的赋值啊,就是然后就是构造函数有继承的情况,就是静态负类的静态,子类的静态,然后子类的负类的非静态负类的构造函数,子类的非静态子类的构造函数啊所以说嗯,对,你就可以看这个,看我这边这个变量,一个变量的赋值过程啊,就是它整个过程你看就是它。
11:00
链接,链接的准备阶段,就把这个变量。静态变量呃,赋为默认值啊,然后在初始化这个阶段就是CR的方法,它会为类的静态变量赋值啊,它是第一次加载class文件的时候会执行的,然后只会执行一次啊,并且它会保证负类子类的C的方法执行前负类的C方法已经执行完毕,而使用这个阶段,它是就是实例构造器方法,就是它每次创建对象都会这个执行这个方法,这个方法的逻辑是啥呢?它就是会显示调用负类的因译的方法,然后呢,在执行类类非静态成像变量的赋值类的构造。构造代码块,然后再执行类的构造函数啊。对,理解了这个你。就这些先执行顺序,你就离彻底搞懂了嘛,然后的话,最后的话卸载就是垃圾受理,我们不仅发生在堆中方法其中也会发生,但是对方法局中类型数据的回收条件比较苛刻啊,就是以这个为例啊,就是想我们想回收这个simple类的啊,它必须得这个simple对象没有代表simple类class对象也没有这个load也都被回收,意思这三个都被回收了,它才有可能,它不是一定啊,它才有可能这个simple类的。
12:24
2D数据结构它才会回收,所以我们可以看到这个方法去类型回收的条件比较苛刻,但是效果的话不是很明显,所以说有些垃圾收集器直接就不会对方法局这的类型数据啊进行回收的,对总结一下就是我们这个类的加载过程,就是一个这个思维导图嘛,就是就是很方便类的变量的复制过程,主要也就是也是一个思维导图,就是搞懂它这个执行顺序,非常的方便,好吧,然后这篇文章放到我的家望面试通关100分钟了。如果有想要的小伙伴可以点击头像私信回复专栏免费领取啊好吧,然后今天的视频就到这里了,如果有帮助到你的话,欢迎点赞关注转发,我们下期见喽,拜拜。
我来说两句