【JVM】类加载机制
源码到类文件
编译过程
Person.java -> 词法分析器 -> tokens流 -> 语法分析器 -> 语法树/抽象语法树 -> 语义分析器 -> 注解抽象语法树 -> 字节码生成器 -> Person.class文件
类文件解读
官网参考:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html
- 魔数(magic):cafe babe
- class文件版本:minor_version(0000),major_version(0034:52–JDK8的一个版本)
- 常量池数量(constant_pool_count):0027–27个常量
- 常量池(constant_pool)
- 访问标志(access_flags)
- 类索引(this_class)
- 父类索引(super_class)
- 接口表数量(interfaces_count)
- 接口表(interfaces)
- 字段表数量(fields_count)
- 字段表(fields)
- 方法表数量(methods_count)
- 方法表(methods)
- 属性表集合(attributes_count)
- 属性表(attributes)
类文件到虚拟机(类加载机制)
使用和卸载不算是类加载过程中的阶段
装载(load)
作用
- 通过一个类的全限定名获取定义此类的二进制字节流
- 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
- 在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口
类装载器(ClassLoader)
加载顺序
- 自顶向下,由上层来逐层尝试加载此类
加载原则
- 自底向上逐层检查,只要某个Classloader已加载,就视为已加载此类,保证此类只所有ClassLoader加载一次。
双亲委派机制
定义
- 如果一个类加载器在接到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
优势
- 保证同一个类再不同的加载环境下加载出来的都是用一个类
破坏
- 继承ClassLoader类,然后重写其中的loadClass方法
链接(Link)
验证(Verify)
- 文件格式验证
- 元数据验证
- 字节码验证
- 符号引用验证
准备(Prepare)
- 为类的静态变量分配内存,并将其初始化为默认值
解析(Resolve)
- 把类中的符号引用转换为直接引用
初始化(initialize)
- 对类的静态变量,静态代码块执行初始化操作
评论区