JVM之class加载过程
java虚拟机把描述类的数据从class文件加载到内存,并对数据进行 校验/准备/解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。
称作虚拟机的类加载机制。
loading -> linking (verification -> preparation -> resolution)-> resolution)->initializing
loading: 把class文件load到内存中,采用双亲委派,主要是为了安全性
verification: 校验class文件是否符合标准
preparation: 静态变量分配内存并设初始值的阶段(不包括实例变量)
resolution:把符号引用转换为直接引用
initializing:静态变量赋初始值
类加载的过程主要分为三个部分:加载、连接、初始化这三个阶段。
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个这个类的java.lang.Class对象,用来封装类在方法区类的对象。主要步骤可以分为下面的三件事情:
加载阶段完成后,虚拟机外部的 二进制字节流就按照虚拟机所需的格式存储在方法区之中,而且在Java堆中也创建一个java.lang.Class类的对象,这样便可以通过该对象访问方法区中的这些数据。
类的加载的最终产品是位于堆区中的Class对象。Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。加载类的方式有以下几种:
2.加载器
JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:
1.BootstrapClassLoader(启动类加载器)
在连接里面又可以被分成3个小阶段,分别是:验证,准备,解析
1.验证(目的):
2.验证内容:
验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。验证阶段大致会完成4个阶段的检验动作:
验证阶段是非常重要的,但不是必须的,它对程序运行期没有影响,如果所引用的类经过反复验证,那么可以考虑采用-Xverifynone参数来关闭大部分的类验证措施,以缩短虚拟机类加载的时间。
3.准备:
在准备阶段,为静态变量的初值为jvm默认的初值,而不是我们在程序中设定的初值。jvm默认为静态变量的初值是这样的
4.解析:
这一阶段的任务就是把常量池中的符号引用转换为直接引用 什么是符号引用,什么是直接引用。
1.工作内容:
JVM负责主要对类变量(类变量就是static修改的变量)进行初始化这里主要对类变量(类变量就是static修改的变量)进行初始化,初始化主要有两个方式:
2.初始化时机:
类初始化时机:只有当对类的主动使用的时候才会导致类的初始化,类的主动使用包括以下六种:
3.初始化顺序:
如果有父类,则顺序是:父类static方法/static变量赋值 –> 子类static方法/static变量赋值
三、结语:
上面介绍的就是类(class)的加载,包含它的加载、链接、初始化。
Android进阶知识点,我最近整理了许多,里面讲解的非常详细。取
https://docs.qq.com/doc/DUkNRVFFzTG96VHNiAndroid 技术进阶手册丶面试题纲丶核心笔记资料。