JVM类加载机制

类加载:mapping 一个类或者接口的名称 to class object,具体包括加载,链接,初始化过程。

JAVA APIs 例如 Class.forName(),classLoader.loadClass() ,放射APIs以及JNI_FindClass可以开始类加载。VM本身可以开始类加载,在jvm启动的时候会加载一些核心类如java.lang.Object,java.lang.Thread,etc,加载一个类需要加载所有的父类或者父接口。在链接阶段,classfile验证,可能需要加载附加的类。
VM 和 Java SE类加载类库共同负责类加载。VM负责加载常量池;链接,初始化类和接口。加载阶段由VM和特定的class loaders共同完成。

加载阶段:
加载阶段,通过一个类或者接口的名称,找到二进制格式的classfile,定义class 并创建java.lang.Class对象.

链接阶段:
首先进行校验,检查classfile语法,检查常量池符号 并做 type checking.然后进行准备,初始化静态属性的标准的默认值,分配方法表。这个时候还没有任何java代码运行.然后 选择性的做一些符号引用的解析。

类的初始化:
类初始化运行静态初始化器,初始化静态属性。这是这个类的first java code run.注意 类的初始化需要父类的初始化。
JVM规范明确类初始化发生在首次使用一个class的时候。HotSpot VM通常是在类的初始化的时候才开始加载和链接类。
所以 如果A引用B 加载A不会加载B只有在首次执行B的引用的时候才会加载链接初始化B.(联想到了多态)

Class Loader Delegation:
类加载委托机制,一个加载器加载一个类的时候,可以委托给另一个类去加载。前者叫初始加载器,后者叫定义加载器。
Bootstrap class loader
extension class loader
system class loader
System class loader 是默认的应用加载器,在运行main的时候从classpath加载类。应用类加载器可以是java se 类库的也可以是自定义的。extension class loader 加载jre 下面 lib/ext的类。

Bootrap 加载器:

加载BOOTPATH下面的类 例如rt.jar. 还会预加载CDS.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值