JVM学习--ClassLoader加载过程
JVM中的方法区(Java8开始叫元空间)中存储了JVM加载的类的信息和运行时常量池信息,class文件加载到jvm称之为DNA元数据模板
类加载器只负责加载class文件,至于是否可以运行,由执行引擎决定是否可以运行
类的加载过程分为 加载 loading -- 链接 linking -- 初始化 initialize
加载 loading:
1)通过类的全限定名获取到类的二进制字节流
2)将字节流代表的静态存储结构转换为方法区的运行时数据结构
3)在内存中生成一个代表此类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
链接 linking
1)verify 验证 是否是一个class文件,比如验证是否以cafebabe开头
2)prepare 准备,在这个阶段会给类变量分配内存和 初始化变量初始值和零值
private static int a = 1;
a 在这个阶段赋值的是0 ,在后面的初始化阶段才会赋值1,在准备阶段是0,引用对象在准备阶段是初始化为null
如果一个变量被final 修饰,那么就不能叫变量,是一个常量,常量在编译期间就已经分配内存,在准备阶段是显式的初始化,也就是 会赋值为1
准备阶段不会为实例变量分配初始化,因为这个时候对象还没有创建
类变量会分配在方法区中,实例变量会随着对象一起分配到java堆中
3)resolve 解析 将常量池中的符号引用转换为直接引用,解析的动作主要是针对类或接口、字段、类方法、接口方法、方法类型等