内容简介:JVM类加载分为5个过程:加载,验证,准备,解析,初始化,使用,卸载,如下图所示:加载是指连接是指将创建好的类放入JVM并使之能够很好的执行的过程。
JVM类加载分为5个过程:加载,验证,准备,解析,初始化,使用,卸载,如下图所示:
加载
加载是指 查找字节流 并据此 创建类 的过程。
- (1) 数组类没有对应的字节流,它是由JVM根据元素类型和维度,创建的。
- (2) 除了数组类,其他类都是JVM借助
BootStrap ClassLoader
、ClassLoader
、ExtClassLoader
、AppClassloader
等类加载器来查找字节流并创建的。 - (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的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先触发其初始化。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- JVM类生命周期概述:加载时机与加载过程
- JVM类加载过程
- ClassLoader(二)- 加载过程
- 【JVM】 类加载的过程
- java类加载过程浅分析
- 探秘Runtime - Runtime加载过程
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
算法概论
Sanjoy Dasgupta、Christos Papadimitriou、Umesh Vazirani / 钱枫 注、邹恒明 注 / 机械工业出版社 / 2009-1 / 55.00元
《算法概论(注释版)》源自加州大学伯克利分校和加州大学圣迭戈分校本科生的算法课讲义,以独特的视角展现了算法设计的精巧技术及魅力。在表达每一种技术时,强调每个算法背后的简洁数学思想,分析其时间和空间效率,运用与其他技术类比的方法来说明特征,并提供了大量实例。《算法概论(注释版)》以人类最古老的算法(算术运算)为起点,将各种算法中优美而有代表性的内容囊括书中,并以最前沿的理论(量子算法)结束,构成了较......一起来看看 《算法概论》 这本书的介绍吧!