JVM学习笔记(二)
类加载的过程
类加载的过程主要分为加载、链接、初始化3个步骤
-
加载
通过类加载器把指定的class字节码文件以二进制流的方式加载到内存当中。
-
链接
链接又包含了3个步骤:
-
验证
验证加载到内存当中的字节码是否合法,比如是否符合jvm的规范,或是检验其是否存在威胁,比如说字节码文件被恶意篡改等等情况,避免威胁到虚拟机本身的运作。
-
准备
在验证合法后,进入准备阶段,在这个阶段,为所有类变量分配空间,并赋上默认初始值,即零值,比如int类型赋值为0,float类型赋值为0.0,一些自定义类变量赋值为null等等。但注意,一旦带有final static修饰的是常量,不是在此准备阶段分配内存的,在编译时已经分配内存,但会在准备阶段显式赋值,随着类加载的同时加载到内存当中,只能被引用,不能再被赋值。
-
解析
在这个过程,将会把符号引用转化成直接引用。由于考虑到一些类等资源的引用可能比较庞大,所以在class字节码文件当中只是用符号来指明引用,而到了解析的步骤,将会根据符号引用变成直接引用,直接指向实际引用的具体结构。
-
-
初始化
初始化步骤就是在程序使用new关键字调用类构造器时所执行的步骤,有两个方法需要了解,一个是**<init>方法,一个是<clinti>方法。<clinti>是类构造方法,注意,不是类构造器,它主要是处理类变量即带有static修饰的变量的赋值,以及静态代码块即static{}包裹的变量初始化操作。如果存在父子关系的,先执行父类的<clinti>方法,才会执行子类的<clinti>方法。而<init>**方法便是类构造器方法,一个类至少会有一个构造器方法,如果不显式定义,系统将会默认生成一个无参的空构造器。