类加载的过程

什么是类加载?Java编译器会将我们编写好的代码编译成class字节码文件,JVM会把这些class字节码文件加载到内存中,并对加载的数据进行校验、准备、解析并初始化,这个过程就是类加载机制。类加载分为三个阶段:加载,连接,初始化。

这三个阶段都是在程序运行期间完成的。其中加载,校验,准备,初始化,卸载的顺序都是确定的,解析可能会在初始化之后完成。

JVM 可以选择符号引用解析的时机,一种是当类文件加载并校验通过后,这种解析方式被称为饥饿方式。另外一种是符号引用在第一次使用的时候被解析,这种解析方式称为惰性方式。

1、加载

将字节码文件加载到内存中,并将这些静态数据转换成方法去中的运行书数据区,在堆中生成一个这个类的class对象,作为方法区数据的访问入口,这个过程需要类加载器的参与。



加载的过程:

(1)通过一个类的全限定名(包名和类名)来获取此类的二进制字节流Class文件。获取的方式可以通过jar包,war包,网络中获取,Jsp生成等方式。

(2)将字节码中的静态存储结构转换为方法区中的运行时数据结构。例如将class文件常量池转换为运行时常量池

(3)在内存中生成这个类的java.lang.Class对象,作为方法区中的各种数据的访问入口。

加载完成之后,虚拟机外部的二进制字节流按照虚拟机的格式存储在方法区中。

2、连接

连接阶段负责将类中的二进制数据合并到JRE中,类的连接大致分为三个阶段:

验证:确保Class文件字节流中包含的信息符合虚拟机的要求。验证分为四个阶段的校验操作:

(1)文件格式验证:验证字节流是否符合Class文件格式的规范。

(2)元数据验证:对字节码描述的信息进行语义分析,来保证其描述的信息符合Java语言规范的要求。

(3)字节码验证:通过数据流和控制流分析确定程序语义是合法的。这个阶段对类的方法进行校验分析,保证被校验类不会做出危害虚拟机的行为。

(4)符号引用验证:虚拟机将符号引用转换为直接引用,这个动作发生在解析阶段中。主要的验证的操作:

a.符号引用中通过字符串描述的全限定名是否能找到对应的类。

b.载指定泪痕总共是否存在符合方法字段描述符以及简单名称描述的方法字段。

c.符号引用中的类,字段,方法的访问修饰符是否可以被当前类访问。

准备

准备阶段为类的静态变量在方法区中分配内存并赋默认值(0或者null)。

对于一般的成员变量在实例化时,随着对象一起在堆中分配内存。

对于静态常量在准备阶段赋自己设定的值,而静态变量是在初始化阶段完成的。

解析

解析阶段是虚拟机将虚拟引用转换为直接引用的过程。

符号引用:符号引用以一组符号来描述所引用的目标,符号可以是任意形式的字面量,只要使用时能无歧义的定位到目标即可。引用的目标不一定已经到加载内存中,与内存布局无关。

直接引用:直接可以指向目标的指针,相对偏移量或者是一个能间接定位到目标的句柄。直接引用与内存布局相关。

主要分为:类或者接口的解析、字段的解析、类方法的解析、接口方法的解析,方法句柄,方法类型的解析。

3、类的初始化

类的初始化过程是执行类构造器方法的过程。

a、方法是由所有类变量的赋值操作和静态语句块组成的。

static int i=1;
static{ }

b、方法对于类或者接口不是必需的,如果一个类没有静态变量或者静态语句块那么编译期可以部位这个类生成方法

c、父类的先于子类的方法执行,所以父类中定义的静态代码块要先于子类的静态代码块执行。所以可以得出以下执行顺序:

顺序:初始化父类的静态代码->初始化子类的静态代码->初始化父类非静态代码->初始化父类的构造函数->初始化子类的非静态代码->初始化子类的构造函数

注意:类构造器的与构造函数的不同。

类加载的时机

类的主动引用(一定会发生类的初始化

1、new一个类的对象

2、调用类的静态成员(除了final常量)和静态方法

3、使用java.lang.reflect包的方法对类进行反射调用

4、当虚拟机启动先启动main方法所在的主类

5、当初始化一个类,如果其父类没有被初始化,则先初始化它父类;接口不同的是不要求所有的父接口都初始化

类的被动引用(不会发生类的初始化)

6、当访问一个静态域时,只有真正声名这个域的类才会被初始化

7、通过子类引用父类的静态变量,不会导致子类初始化

8、通过数组定义类的引用,不会触发此类初始化

9、引用常量不会触发此类的初始化(常量在编译阶段就存入调用类的常量池中

参考:《深入理解Java虚拟机》

JVM类加载机制一的更多相关文章

  1. JVM基础系列第7讲:JVM 类加载机制

    当 Java 虚拟机将 Java 源码编译为字节码之后,虚拟机便可以将字节码读取进内存,从而进行解析.运行等整个过程,这个过程我们叫:Java 虚拟机的类加载机制.JVM 虚拟机执行 class 字节 ...

  2. JVM总结(四):JVM类加载机制

    这一节我们来总结一下JVM类加载机制.具体目录如下: 类加载的过程 类加载过程概括 说说引用 详解类加载全过程: 加载 验证 准备 解析 初始化 虚拟机把描述类的数据从Class文件加载到内存,并对数 ...

  3. JVM 类加载机制详解

    如下图所示,JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lan ...

  4. Java虚拟机(四):JVM类加载机制

    1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...

  5. JVM类加载机制详解(二)类加载器与双亲委派模型

    在上一篇JVM类加载机制详解(一)JVM类加载过程中说到,类加载机制的第一个阶段加载做的工作有: 1.通过一个类的全限定名(包名与类名)来获取定义此类的二进制字节流(Class文件).而获取的方式,可 ...

  6. JVM类加载机制(转)

    原文出自:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运 ...

  7. JVM类加载机制详解

    引言 如下图所示,JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 加载 在加载阶段,虚拟机需要完成以下三件事情: 1)通过一个类的全限定名来获取定义此 ...

  8. Android动态加载--JVM 类加载机制

    动态加载,本质上是通过JVM类加载机制将插件模块加载到宿主apk中,并通过android的相关运行机制,实现插件apk的运行.因此熟悉JVM类加载的机制非常重要. 类加载机制:虚拟机把描述类的数据从C ...

  9. Java虚拟机(五):JVM 类加载机制

    一.JVM 类加载机制 JVM 类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 1. 加载: 加载是类加载过程中的第一个阶段,这个阶段会在内存中生成一个代表 ...

  10. 深入理解JVM虚拟机6:深入理解JVM类加载机制

    深入理解JVM类加载机制 简述:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 下面我们具体 ...

随机推荐

  1. Codeforces Round #394 (Div. 2) 题解

    无需吟唱,直接传送 problem A 题目大意 已知有n个偶数,m个奇数,问这些数有没有可能组成一个严格递增1的序列 题解 判断abs(n,m) <= 1即可,注意n,m均为0的情况. Cod ...

  2. Ubuntu16.04 安装 Visual Studio Code之后启动不起来

    $ cd ~/.config $ sudo rm -rf ./Code/ 参考博客:Ubuntu16.04 安装 Visual Studio Code之后启动不起来

  3. 用nexus搭建自己的maven私有仓库

    用nexus搭建自己的maven私有仓库  刚安装nexus时,nexus启动失败,启动不到1分钟,自动停止.后来查找到了原因: Java 6 Support EOLOracle's support ...

  4. Spring 3.1新特性之三:Spring支持Servlet 3.0(待补充)

    高效并发是JDK 1.6的一个重要主题,HotSpot虚拟机开发团队在这个版本上花费了大量的精力去实现各种锁优化技术,如适应性自旋(Adaptive Spinning).锁削除(Lock Elimin ...

  5. [allmake] -- 交叉编译原来如此简单

    原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处.作者信息和本声明.否则将追究法律责任.:http://www.cnblogs.com/johnd/p/5060530.html 作者:Jo ...

  6. 【机器学习】决策树C4.5、ID3

    一.算法流程 step1:计算信息熵 step2: 划分数据集 step3: 创建决策树 step4: 利用决策树分类 二.信息熵Entropy.信息增益Gain 重点:选择一个属性进行分支.注意信息 ...

  7. Microsoft EBooks

    Go pick up what you are interested J http://blogs.msdn.com/b/mssmallbiz/archive/2014/07/07/largest-c ...

  8. c# new三种用法

    前几天去家公司面试,有一道这样的题:写出c#中new关键字的三种用法,思前想后挖空心思也只想出了两种用法,回来查了下msdn,还真是有第三种用法:用于在泛型声明中约束可能用作类型参数的参数的类型,这是 ...

  9. 「GXOI / GZOI2019」逼死强迫症——斐波那契+矩阵快速幂

    题目 [题目描述] ITX351 要铺一条 $2 \times N$ 的路,为此他购买了 $N$ 块 $2 \times 1$ 的方砖.可是其中一块砖在运送的过程中从中间裂开了,变成了两块 $1 \t ...

  10. STP-11-多生成树:IEEE 802.1s

    IEEE802.1s多生成树(MultipleSpanningTrees,MST)有时也称为多STP(MultipleSTP,MSTP),它定义了在使用802.1QVLAN网络中,部署多实例STP的标 ...