JVM学习笔记(二)

类加载的过程

类加载的过程主要分为加载链接初始化3个步骤

JVM学习笔记(二)

  • 加载

    通过类加载器把指定的class字节码文件以二进制流的方式加载到内存当中。

  • 链接

    链接又包含了3个步骤:

    1. 验证

      验证加载到内存当中的字节码是否合法,比如是否符合jvm的规范,或是检验其是否存在威胁,比如说字节码文件被恶意篡改等等情况,避免威胁到虚拟机本身的运作。

    2. 准备

      在验证合法后,进入准备阶段,在这个阶段,为所有类变量分配空间,并赋上默认初始值,即零值,比如int类型赋值为0,float类型赋值为0.0,一些自定义类变量赋值为null等等。但注意,一旦带有final static修饰的是常量,不是在此准备阶段分配内存的,在编译时已经分配内存,但会在准备阶段显式赋值,随着类加载的同时加载到内存当中,只能被引用,不能再被赋值。

    3. 解析

      在这个过程,将会把符号引用转化成直接引用。由于考虑到一些类等资源的引用可能比较庞大,所以在class字节码文件当中只是用符号来指明引用,而到了解析的步骤,将会根据符号引用变成直接引用,直接指向实际引用的具体结构。

  • 初始化

    初始化步骤就是在程序使用new关键字调用类构造器时所执行的步骤,有两个方法需要了解,一个是**<init>方法,一个是<clinti>方法。<clinti>是类构造方法,注意,不是类构造器,它主要是处理类变量即带有static修饰的变量的赋值,以及静态代码块即static{}包裹的变量初始化操作。如果存在父子关系的,先执行父类的<clinti>方法,才会执行子类的<clinti>方法。而<init>**方法便是类构造器方法,一个类至少会有一个构造器方法,如果不显式定义,系统将会默认生成一个无参的空构造器。