什么是类加载
编译器将java文件转为.class文件,class文件保存着虚拟机要执行的指令(业务逻辑代码),当需要某个类的时候,JAVA虚拟机会加载CLASS文件,并创建class对象,将clss文件加载到虚拟机内存。
类加载的过程:
1.加载
(通过ClassLoader创建class对象 ClassLoader:它是用来加载 Class 的。它负责将 Class 的字节码形式转换成内存形式的 Class 对象。)
2.验证
( 主要是为了验证class的正确性,分为 :文件格式的验证,元数据的验证,字节码验证,符号引用验证)
3.准备
( 准备阶段主要为类变量分配内存并设置初始值)
4.解析
(解析阶段主要是虚拟机将常量池中的符号引用转化为直接引用的过程)
5.初始化
(在初始化阶段,主要为类的静态变量赋予正确的初始值,JVM负责对类进行初始化,主要对类变量进行初始化)
类初始化时机
1.创建类的实例,也就是new的方式
2.访问某个类或接口的静态变量,或者对该静态变量赋值
3.调用类的静态方法
4.反射( Class.forName(“XXXX”))
5.初始化某个类的子类,则其父类也会被初始化
6.直接使用 java.exe命令来运行某个主类
JVM三种预定义类型类加载器
当一个JVM启动时:分为:
1.启动类加载器
2.扩展类加载器
3.系统类加载器
类加载双亲委派机制
一个类加载器加载一个类时,首先会把加载动作委派给他的父加载器,如果父加载器无法完成这个加载动作时才由该类加载器进行加载。