JVM类加载过程

栏目: Java · 发布时间: 6年前

内容简介:JVM类加载分为5个过程:加载,验证,准备,解析,初始化,使用,卸载,如下图所示:加载是指连接是指将创建好的类放入JVM并使之能够很好的执行的过程。

JVM类加载分为5个过程:加载,验证,准备,解析,初始化,使用,卸载,如下图所示:

JVM类加载过程

加载

加载是指 查找字节流 并据此 创建类 的过程。

  • (1) 数组类没有对应的字节流,它是由JVM根据元素类型和维度,创建的。
  • (2) 除了数组类,其他类都是JVM借助 BootStrap ClassLoaderClassLoaderExtClassLoaderAppClassloader 等类加载器来查找字节流并创建的。
  • (3) 在JVM中类的唯一性是由类的全名和类加载器确定的,相同的class文件被不同的类加载器加载生成的两个类是不同的。

连接

连接是指将创建好的类放入JVM并使之能够很好的执行的过程。

它可分为验证、准备、解析三个步骤。

  • (1) 验证阶段是为了保证创建的类能够满足JVM的约束条件,例如:jdk版本验证。
  • (2) 准备阶段的目的是 为创建的类的静态字段分配内存 ,对静态字段具体的初始化会在初始化阶段进行。
    部分虚拟机在此阶段还会构造跟其他类层次相关的数据结构(比如用来实现虚拟方法的动态绑定的方法表),在这个阶段该类无法知道其他类、字段及其方法的地址,因此在需要引用这些成员的时候,java编译器会生成一个符号引用,在运行阶段该引用才能够定位到具体的地址。
  • (3) 解析阶段的目的是将符号引用解析成实际引用,如果符号引用指向一个未被加载的成员,那个将触发JVM对这个类的加载。
    JVM规范并没有要求在连接过程中执行解析工作,它仅仅规定如果某些字段使用了符号引用,那么在执行这些字节码之前需要先完成对这些富豪饮用的解析。

初始化

初始化的目的是为标记为常量的字段赋值,以及执行 clinit 方法的过程。

在初始化一个静态字段的时候,我们可以再声明时直接赋值,也可以在静态代码块中对其进行赋值。

如果直接赋值的字段被final所修饰,并且字段为基本数据类型和String类型,那么该字段会被编译标记为常量值,其初始化直接由JVM完成。除此之外的所有直接赋值和静态代码块中赋值操作,会被 java 编译器放到 clinit 方法中。

什么时候需要对类进行初始化?

(1) 虚拟机启动的时候,初始化用户指定的主类。

(2) 使用new该类实例化对象的时候。

(3) 访问静态字段或静态方法时,初始化静态字段或静态方法所在类。

(4) 子类初始化会触发父类初始化。

(5) 如果接口定义了default方法,那么实现该接口的类初始化会触发该接口的初始化。

(6) 使用反射API的时候。

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Just My Type

Just My Type

Simon Garfield / Profile Books / 2010-10-21 / GBP 14.99

What's your type? Suddenly everyone's obsessed with fonts. Whether you're enraged by Ikea's Verdanagate, want to know what the Beach Boys have in common with easy Jet or why it's okay to like Comic Sa......一起来看看 《Just My Type》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具