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 解析 将常量池中的符号引用转换为直接引用,解析的动作主要是针对类或接口、字段、类方法、接口方法、方法类型等

 

posted on 2020-05-28 23:32  Flower2021  阅读(151)  评论(0编辑  收藏  举报