深入拆解虚拟机(三)Java虚拟机是如何加载Java类的?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lwl2014100338/article/details/84189984
引用类型

(1)类、接口、数组类、泛型参数,由于泛型参数在编译过程中被擦除,因此Java虚拟机实际上只有前三种。

(2)在类、接口和数组类中,数组类是由Java虚拟机直接生成的,其他两种则有对应的字节流。


加载

(1)加载,是指查找字节流。Java虚拟机需要借助类加载器完成查找字节流的过程。

(2)在Java9之前启动类加载器负责加载最为基础、最为重要的类,比如存放在JRE的lib目录下的jar包(以及由虚拟机参数-Xbootclasspath指定的类)。除了启动类加载器之外,另外两个重要的类加载器是扩展类加载器和应用类加载器,均由Java核心类库提供。

(3)扩展类加载器的父类加载器是启动类加载器。负责加载相对次要、但又通用的类,比如存放在JRE中的lib/ext目录下jar包中的类。

(4)应用类加载器的父类是扩展类加载器,负责加载应用程序路径下的类。默认情况下,应用程序中包含的类便是由应用类加载器加载的。


链接

(1)链接,是指将创建的类合并至Java虚拟机中,使之能够执行的过程。它分为验证、准备以及解析三个阶段

(2)验证阶段的目的,在于确保被加载类能够满足Java虚拟机的约束条件

(3)准备阶段的目的,则是为被加载的类的静态字段分配内存

(4)解析阶段的目的。是将符号引用解析成实际引用


初始化

初始化,是为标记为常量的值的字段赋值,以及执行 < clinit >方法的过程。类的初始化仅被执行一次,这个特性被用来实现单例的延迟初始化。


猜你喜欢

转载自blog.csdn.net/lwl2014100338/article/details/84189984
今日推荐