jvm---虚拟机类加载机制与双亲委派机制(四)

jvm-虚拟机类加载机制

  • 虚拟机类加载机制
    • 双亲委派模型
    • jvm-虚拟机类加载机制
    • 类加载的时机
    • 类加载的过程
    • 验证
    • 准备
    • 解析
    • 初始化
    • 类加载器
  • 双亲委派模型
    • 启动类加载器
    • 扩展类加载器
    • 应用程序加载类
    • 双亲委派模型的流程

虚拟机类加载机制

双亲委派模型

jvm-虚拟机类加载机制

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制,

类加载的时机

类从被加载到虚拟机内存开始,到卸载出内存为止,整个生命周期包括:加载,验证,准备,解析初始化,使用和卸载,7个过程,jvm---虚拟机类加载机制与双亲委派机制(四)_第1张图片
标红的是顺序固定的,
解析阶段在某些情况下可以在初始化阶段之后进行,为了支持java语言的运行时绑定(也可以称为动态绑定或者晚期绑定)。

类加载的过程

加载是类加载过程的一个阶段
在加载过程中主要完成以下3件事情:
1、通过一个类的全限定名来获取定义此类的二进制字节流。
2、将这个字节流所代表的静态存储结构转化成方法区的运行时数据结构。
3、在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各个数据访问入口
加载完成后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储在方法区之中,方法区中的数据存储格式由虚拟机实现自行定义
加载阶段与连接阶段的部分内容是交叉进行的,加载阶段尚未完成,连接阶段可能已经开始了,但是这些夹在加载阶段中进行的动作,仍然属于连接阶段的内容,这两个阶段仍然保持这固定的先后顺序。

验证

连接阶段的第一步,这一阶段为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并不会危害虚拟机自身的安全。
1.文件格式验证(字节流是否符合Class文件格式的规范,并且能被当前版本的虚拟机处理)
2.元数据验证(对字节码描述的信息进行语义分析,以保证其描述信息符合java语言规范)
3.字节码验证(通过数据流和控制流分析,确定程序语义是合法的符合逻辑的)
4.符号引用验证(虚拟机将符号引用转化为直接引用的时候,这个转化将在解析发生)

准备

准备阶段是正式为类变量分配内存并设置变量初始值的阶段,这些变量所使用的内存将在方法区中进行分配。

解析

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。
符号引用(引用一组符合来描述所引用的目标),直接引用(可以说直接指向目标的指针,相对偏移量或是一个能间接定位到目标的句柄)
1.类或接口的解析
2.字段解析
3.类方法解析
4.接口方法解析

初始化

类加载过程的最后一步

类加载器

类与类加载器,(两个类来源于同一个Class文件,被同一个类加载器加载,只要加载他们的类加载器不同,那么这两个类加载器必定不一样

双亲委派模型

对于java虚拟机来说,存在两种不同的加载器,一种是启动类加载器,一种是其他所有类加载器,这些都是由java语言实现,独立于虚拟机之外,全部继承于抽象类。

启动类加载器

负责将存放在\lib目录中的,是虚拟机按文件名字识别的类库加载到虚拟机内存中。启动类加载器无法被java程序直接引用,

扩展类加载器

负责加载\lib\ext目录中的,开发者可以直接使用

应用程序加载类

负责加载用户程类路径上所指定的类库,开发者可以直接使用这个类加载器,如果程序里面没有加载器,一般来说这个是默认的加载器
jvm---虚拟机类加载机制与双亲委派机制(四)_第2张图片

双亲委派模型的流程

一个类加载器收到加载类的请求时,它不会首先去自己尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的加载器都是如此,因此所有的加载请求最终都会委派到顶层的启动类加载器中,只有当父类加载器反馈无法加载这个类的时候(搜索范围内没有找到所需要的类),子加载器才会去加载。就是父类可以就父类去完成,不行的时候子类上去补一下。


学习心得
对与这一本《深入了解jvm虚拟机》我也是大概过了一遍,很多东西不是很明白,还要深入的了解了解,随着以后的不断学习也会不定时的研究,加油骚年,奥里给.(ps:今天刚刚明白csdn还可以用内嵌html的形式来写,爽啊,有点牛逼。)

你可能感兴趣的:(jvm,java后端,jvm,java)