Java类加载机制

2021-03-26  本文已影响0人  淡季的风

Java类加载是指将编译好的class文件加载至JVM内存, 形成可供JVM使用的Java实例, 这个过程叫做类的加载。


image.png

1、类的加载过程

类的加载过程包括了加载, 连接, 初始化3个阶段, 其中连接阶段又分为验证,准备,解析 3个阶段, 总体上可以分为加载验证准备解析初始化五个阶段。

这五个阶段中, 除过解析阶段, 其他阶段的顺序都是固定的, 而解析阶段则不一定, 有些时候晚于初始化阶段发生, 这是为了支持Java中的运行时绑定。其他几个阶段都是按顺序开始, 但不一定按顺序进行或完成, 往往是交叉运行, 在一个阶段中调用下一个阶段。

1.1、 类的加载: 查找并加载类的二进制数据

加载时类加载过程的第一个阶段, 在加载阶段, 虚拟机主要完成3件事情:

image.png

类的加载并不时该类被用到时才会被加载, JVM规范允许类加载器在预料某个类可能被使用时就加载该类。 如果加载时, 该类对应的class文件不存在或者错误, 类加载器必须在首次使用该类时报告一个类加载错误, 如果类从未被使用, 则不会报错。

加载class的方式:

1.2、 验证: 确保被加载类的正确性

验证连接阶段的第一个阶段,主要时保证类的合法性, 确保Class字节流包含的信息是否符合当前虚拟机的要求, 并且不会危害虚拟机本身的的安全, 验证阶段大致会完成4个阶段的验证动作:

1.3、 准备: 为类的静态变量分配内存, 并初始化为默认值

准备阶段时正式为类变量分配内存并设置初始默认值的阶段, 这些内存都将在方法区分配。

这个阶段需要注意以下几点:

1.4、 解析: 把类中的符号引用转为直接引用

解析阶段时将常量池类的符号引用转化为直接引用。解析阶段主要针对,接口,字段,类方法,接口方法,方法符号,调用点等7类符号引用进行。

1.5、类的初始化

初始化主要时为类的静态变量赋予正确初始值, JVM 负责对类初始化, 主要时对类变量初始化。 在Java中为类变量设定初始化有两种方式:

JVM初始化步骤:

类的初始化时机:

2、类加载器

2.1、类加载器层次

image.png

应用程序由以上3类加载器相互配合加载, 用户也可以尝试自定义加载器, 比如:

2.2、类的加载

类的加载又种方式:

2.3、寻找类的加载器

AppClassLoader -> ExtClassLoader -> BootStrapClassLoader

3、类的加载机制

类的加载机制有以下几个特点:

3.1、 双亲委派机制

1、 当AppClassLoader加载一个Class时, 首先会传递给ExtClassLoader去加载。
2、 当ExtClassLoader收到加载Class的请求时, 也不会尝试自己去加载, 会传递给BootStrapClassLoader去加载。
3、 如果BootStrapClassLoader加载失败, 则会由ExtClassLoader来加载。
4、 如果ExtClassLoader加载失败, 会由AppClassLoader来加载。
5、 如果AppClassLoader加载失败, 会报出异常ClassNotFoundException

3.2、 双亲委派优势

4、 自定义类加载器

5、参考资料

https://www.pdai.tech/md/java/jvm/java-jvm-classload.html

上一篇下一篇

猜你喜欢

热点阅读