JVM相关知识---类加载的过程

类加载的过程

        类从加载到虚拟机开始,到卸载出内存后,总共的生命周期包括:加载、验证、准备、解析、初始化、使用和卸载。验证、准备、解析这是三个步骤被称为连接。

        加载、验证、准备、初始化和卸载这五步的顺序是固定,必须按照这个顺序开始,而解析这个步骤是不一定的,它可以放在初始化的后面,这是为了支持java语言的运行时绑定。在类加载这几步中,要注意的是,他们是按部就班的开始的,而不是按部就班的运行,就是说,他们可以并行,通常是交叉着混合进行,在一个阶段内激活、运行另一个阶段。 

        运行初始化的情况:

       1、遇到new、getstatic、putstatic、Invokestatic这四条指令时。

       2、使用java.lang.reflect包的方法进行反射调用的时候,如果没初始化,则必须先初始化。

       3、初始化一个类是发现他的父类还没有初始化。

       4、执行主类时(包含main方法的类),要先对这个类进行初始化。

      5、当使用JDK1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果是REF_getStatic、REF_getStatic、REF_getStatic的方法句柄,并且这个方法句柄所对应的类没有进行初始化,则需要先触发其初始化。

       这五个情况是虚拟机严格规范的,有且只有的情况。

 

1、加载

在加载过程中,虚拟机会完成以下的三件事情:

           (1)、通过一个类的权限定名来获取定义此类的二进制字节流、

           (2)、将字节流所代表的静态存储结构转化为方法区的运行时数据结构。

           (3)、在内存中生成一个代表这个类的class对象,作为方法区这个类的各种数据的访问路口。

       来发人员可以通过重写加载器的loadClass()方法来控制非数组对象的加载阶段。

       数组对象本身不由加载器加载,而是由虚拟机直接加载出来,但是数组的元素类型最终是要通过加载器加载出来的。

      

2、验证

        这一阶段主要是为了确保Class文件的字节流中包含的信息符合当前的虚拟机的要求,并且不会危害虚拟机自身的安全。

        其中包括:

        (1)文件格式验证

        (2)元数据验证

        (3)字节码验证

 

3、准备

        准备阶段是正式为变量分配内存并设置类变量初始值的阶段,这些变量所使用的初始值都将在方法区中分配。需要注意的是,这次的内存分配,只是包括类变量,就是被static修饰的变量,而此次的赋值,赋的都是零值。


4、解析

解析阶段就是虚拟机将常量池的符号引用替换为直接引用的过程。


5、初始化

这是加载的过程的最后一步,在这个阶段,会根据程序员去定义变量。就是执行类构造器<clinit>()方法的过程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值