类的加载
类从被加载到虚拟机内存到被卸载一共有7个阶段
加载 ------> [ 验证 ------> 准备 ------> 解析 ] ------> 初始化 ------> 使用 ------> 卸载
加载:是 “类加载” 的一个阶段。主要完成3件事:
@1 . 通过类的全限定名获取定义此类的二进制字节流 【获取的方式很多,不一定是java文件生成的,只要是符合规范的 class 字节码就行】
@2. 将这个字节流所代表的静态存储结构抓话你为方法区运行时的数据结构 【此数据结构并没有明确的规范,】
@3. 在内存中生成一个类对象 【class对象,而非此类的实例化对象】
验证:文件格式验证 -----> 元数据验证 -----> 字节码验证 ----->符号引用验证
文件格式验证:按照类的格式验证【class文件】,开头有4个字节验证是否为正确的class文件,再有4个字节验证版本......
元数据验证:主要是对类的语义进行校验,保证不存在不符合Java语言规范的元数据信息【比如是否使用了不被继承的类等等违反语法的】
字节码验证:保证被校验类的方法在运行时不会做出危害虚拟机安全的事情,比如要校验 操作数栈 和 指令能配合工作, 保证类型转换的有效性
符号引用验证:类自身以外的信息进行匹配性校验 , 如引用中的类、字段、方法的访问性是否可被当前类访问 ,符号引用能否通过字符串描述的权限顶名找到对应的类......
准备:
为类变量分配内存【static修饰的域】,实例变量将会在类初始化时进行分配。需要注意的是为static分配的内存初始化为null ,直到初始化阶段才会将其具体的赋值。对于常量【static final修饰】将会直接进行赋值。
解析: 虚拟机将常量池的符号引用替换为直接引用的过程
初始化:进行类的初始化