JVM-类加载器、双亲委派模型

1. 什么是类加载器

JVM只会运行二进制文件,类加载器的作用就是将字节码文件加载到JVM中,从而让java程序能够启动起来

2.类加载器有哪些?

  1. 启动类加载器(BootStrap ClassLoader):加载JAVA_HOME/jre/lib目录下的库
  2. 扩展类加载器(ExtClassLoader):主要加载JAVA_HOME/jre/lib/ext目录中的类
  3. 应用类加载器(AppClassLoader):用于加载classPath下的类
  4. 自定义类加载器(CustomizeClassLoader):自定义类继承ClassLoader,实现自定义类加载规则

双亲委派模型

什么是双亲委派模型?

加载某一个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则会继续向上委托,如果该类委托上级没有被加载,子加载器尝试加载该类。

如果加载的类在上级找到,则子加载器不用加载,例如String类。即优先使用JDK原生的类

JVM为什么采用双亲委派机制?

  1. 通过双亲委派机制可以避免某一个类被重复加载,当父类已经加载后则无需重复加载,保证唯一性。
  2. 为了安全,保证类库API不会被修改

由于是双亲委派机制,java.lang.String的在启动类加载器得到加载,因为在核心jre库中有其相同名字的类文件,但该类中并没有main方法。这样就能防止恶意篡改核心API库

类装载的执行过程

类从加载到虚拟机中开始,直到卸载为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解析这三个部分统称为连接(linking)

加载

  1. 通过类的全名,获取类的二进制数据流
  2. 解析类的二进制数据流为方法区内的数据结构(Java类模型)
  3. 创建java.lang.Class类的实例,表示该类型。作为方法区这个类的各种数据的访问入口

连接

验证

验证类是否符合JVM规范,安全性检查

  1. 格式检查,如:文件格式是否错误,语法是否错误、字节码是否合规
    1. 文件格式验证
    2. 元数据验证
    3. 字节码验证
  2. 符号引号验证:Class文件在其常量池会通过字符串记录自己将要使用的其他类或者方法,检查他们是否存在

准备

为类变量分配内存并设置类变量初始值

  1. static变量,分配空间在准备阶段完成(设置默认值),赋值在初始化阶段完成
  2. static变量是final的基本类型,以及字符串常量,值已确定,赋值在准备阶段完成
  3. static变量是final的引用类型,那么赋值也会在初始化阶段完成

解析

把类中的符号引用转换为直接引用

比如:方法中调用了其他方法,方法名可以理解为符号引用,而直接引用就是使用指针直接指向方法。

初始化

对类的静态变量,静态代码块执行初始化操作

  1. 如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类
  2. 如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行

使用

JVM开始入口开始执行用户的程序代码

  1. 调用静态类成员信息(比如:静态字段、静态方法)
  2. 使用new关键字为其创建对象实例

总结

  1. 加载:查找和导入class文件
  2. 验证:保证加载类的准确性
  3. 准备:为类变量分配内存并设置类变量初始值
  4. 解析:把类中的符号引用转换为直接引用
  5. 初始化:对类的静态变量,静态代码块执行初始化操作
  6. 使用:jvm开始从入口方法开始执行用户的程序代码
  7. 卸载:当用户程序代码执行完毕后,JVM便开始销毁创建的class对象
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值