JVM学习之类加载机制、类装载器、双亲委派

编译过程

Person.java -> 词法分析器 -> tokens流 -> 语法分析器 -> 语法树/抽象语法树 -> 语义分析器-> 注解抽象语法树 -> 字节码生成器 -> Person.class文件

类加载机制 (类的生命周期)

在这里插入图片描述
也就是class文件到虚拟机
loading、linking、initalizing
装载、链接、初始化
1.装载(Load)

查找和导入class文件
(1)通过一个类的全限定名获取定义此类的二进制字节流
(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构(可看另一个运行数据区说明文件)
(3)在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口

2.链接(Link)
1.验证

保证被加载类的正确性
文件格式验证
元数据验证
字节码验证
符号引用验证

2.准备

为类的静态变量分配内存,并将其初始化为默认值
比如:static int a=10; 那么就会为它分配空间,然后初始化值为0;

3.解析

把类中的符号引用转换为直接引用
符号引用:就是class文件里面的代称,通过另一种方式代替我们的变量 方法等
符号引用以一组符号来描述所引用的目标,符号可以使任何形式的字面量。
直接引用:就是直接在jvm里面分配真正的地址区域
直接引用可以使直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。直接 引用和迅疾的内存布局实现有关

3.初始化

对类的静态变量,静态代码块执行初始化操作
也就是 上面例子 变为 a=10;真正的赋值

类装载器ClassLoader

在这里插入图片描述

加载机制
检查某个类是否已经加载:顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个Classloader已加载,就视为已加载此类,保证此类只所有ClassLoader加载一次。
加载的顺序:加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。
工作过程:如果一个类加载器收到一个类加载的请求,它首先不会自己加载,而是把这个请求委派给父类加载器。只有父类无法完成时子类才会尝试加载。

双亲委派机制

双亲委派机制(先从上到下,依次询问装载,保证只有一份,如果前面都没有,那就只有最后一层)
定义:如果一个类加载器在接到加载类的请求时,它首先不会自己尝试去加载这个类,而是把
这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类加载任务,就
成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
优势:Java类随着加载它的类加载器一起具备了一种带有优先级的层次关系。比如,Java中的
Object类,它存放在rt.jar之中,无论哪一个类加载器要加载这个类,最终都是委派给处于模型
最顶端的启动类加载器进行加载,因此Object在各种类加载环境中都是同一个类。如果不采用
双亲委派模型,那么由各个类加载器自己取加载的话,那么系统中会存在多种不同的Object
类。
破坏:可以继承ClassLoader类,然后重写其中的loadClass方法,其他方式大家可以自己了解
拓展一下。
注:可以去看下Classloader.java中的loadClass的源码,就是先从父级开始判断,没有才自己加载

发布了10 篇原创文章 · 获赞 8 · 访问量 300

猜你喜欢

转载自blog.csdn.net/weijx_/article/details/104068535