.Java类加载机制
装载 ---> 链接(验证 --> 准备 --> 解析) ---> 初始化
1.JVM类加载机制:
装载:
1.找到该类型的class文件,产生一个该类型的class文件二进制数据流(ClassLoader需要实现的loadClassData()方法)
2.解析该二进制数据流为方法区内的数据结构
3.创建一个该类型的java.lang.Class实例
最终:通过defineClass()创建一个Java类型对象(Class对象)
找到二进制字节码,并加载到JVM中
JVM通过类全限定名(包名.类名) + 类加载器 完成类的加载,生成类对应的Class对象
链接:
验证:
负责对二进制字节码进行校验、类信息是否符合JVM规范,有没有安全问题、对class文件长度和类型进行检查
准备:
初始化类中静态变量、并将其初始化为默认值 --- 只初始化静态变量默认值 !!!,给其类变量赋值发生在初始化阶段!!!
对于final类型的变量,准备阶段直接赋初始值
该内存分配发生在方法区
解析:
解析类中调用的接口、类、字段、方法的符号引用,把虚拟机常量池中的符号引用转换为直接引用
初始化:
1.对static类变量指定初始值!!!(2种方式:一种是通过类变量的初始化语句,一种是静态初始化语句)
2.一个类的初始化需要先初始化其父类,并递归初始化其祖先类
装载 ---> 链接(验证 --> 准备 --> 解析) ---> 初始化
1.JVM类加载机制:
装载:
1.找到该类型的class文件,产生一个该类型的class文件二进制数据流(ClassLoader需要实现的loadClassData()方法)
2.解析该二进制数据流为方法区内的数据结构
3.创建一个该类型的java.lang.Class实例
最终:通过defineClass()创建一个Java类型对象(Class对象)
找到二进制字节码,并加载到JVM中
JVM通过类全限定名(包名.类名) + 类加载器 完成类的加载,生成类对应的Class对象
链接:
验证:
负责对二进制字节码进行校验、类信息是否符合JVM规范,有没有安全问题、对class文件长度和类型进行检查
准备:
初始化类中静态变量、并将其初始化为默认值 --- 只初始化静态变量默认值 !!!,给其类变量赋值发生在初始化阶段!!!
对于final类型的变量,准备阶段直接赋初始值
该内存分配发生在方法区
解析:
解析类中调用的接口、类、字段、方法的符号引用,把虚拟机常量池中的符号引用转换为直接引用
初始化:
1.对static类变量指定初始值!!!(2种方式:一种是通过类变量的初始化语句,一种是静态初始化语句)
2.一个类的初始化需要先初始化其父类,并递归初始化其祖先类