JVM加载Class过程

JVM加载Class包括3个阶段:类加载,链接,初始化

1.类加载

JVM通过类的全限定名(包命+类名)找到类的.class文件。然后把这个.class文件加载进来,这个过程需要通过ClassLoader来实现。ClassLoader包括Boostrap ClassLoader,Extendsion ClassLoader和System ClassLoader。

Boostrap ClassLoader:启动类加载器,它用来加载一些jdk的核心类,主要负责JAVA_HOME
/jre/lib下的类的加载,可以通过参数-Xbootclasspath制定需要装入的jar包。 它本身不是用java实现的,所以肯定不是ClassLoader的子类了。

Extendsion ClassLoader:扩展类加载器,用来加载一些扩展类,主要负责JAVA_HOME
/jre/lib/ext下类的加载。此类是ClassLoader的一个子类。

System ClassLoader:系统类加载器 也叫Application ClassLoader。是离我们最近的ClassLoader了,它负责加载CLASSPATH里指定的那些类。我们要实现自己的ClassLoader也是继承自该类。SystemClassLoader的父类是Extension ClassLoader

类的加载过程分两步:第一步:从下往上查找类是否已经加载,如果找到,直接返回已加载的类,如果没找着接着往上找。第二步:如果到Bootstrap ClassLoader还没找到,这时Bootstrap ClassLoader会尝试加载该类,如果成功加载,直接返回加载后的类,如果无法加载,交由Extension ClassLoader去加载,依次类推。如果最后仍然没找到,程序会抛出ClassNotFoundException。

2 链接:

当一个class文件被成功加载后,接下来就要做链接了。链接就是要把二进制的.class文件转换成可以被jvm执行的Class对象的过程。这个过程又分为:检验、准备、解析。

检验:就是检查.class的结构是否正确,是否符合Java虚拟机的语义要求。

准备:包括创建类或接口的静态域以及把这些静态域初始化为标准的缺省值。注意此处的初始化不同于后面的的初始化步骤。如有一个staticString 变量str,我们知道,在JAVAString变量默认的初始值是null,此处的初始化就是将null赋值给str

解析:将类中对另一个类或接口的符合引号转化成全限定名引用,将对他们的方法、字段的符合引用转化成直接引用。

3 初始化:执行类或接口中的静态初始化函数(块),将静态变量初始化。这就是我们平时理解的对静态变量赋值。

至此,一个类才加载完成,可以调用类的类变量了(静态变量)和对类进行实例化了。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值