Java-JVM复习01-类加载机制

1. JVM 结构

在这里插入图片描述

2. JVM 类加载过程

在这里插入图片描述

  • 加载
  1. 获取类的二进制字节流
  2. 将字节流的静态存储结构转化为方法区的运行时数据结构
  3. 在内存中生成java.lang.Class对象,作为这个类的访问入口

连接

  • 验证:确保加载的字节流信息符合虚拟机要求
  1. 验证文件格式、元数据、字节码、符号引用
  • 准备:在方法区中为基本类型变量分配内存空间
  1. 根据基本变量类型,设置其对应的默认初始值
  2. 显示初始化被final修饰的变量(final变量在编译阶段时已被分配)
  • 解析:将常量池中的符号引用替换为直接引用的过程
  1. 符号引用就是用符号描述所引用的目标,符号规范明确定义在Java虚拟机规范
  2. 直接引用可以是指向目标的指针、相对偏移量、能间接定位到目标的句柄

  • 初始化:执行类构造器 <clinit>() 的过程
  1. <clinit>()方法是根据类中的静态变量赋值动作和静态代码块语句自动定义的
  2. 若该类存在父类,JVM保证优先执行父类的<clinit>()

3. 类加载器

在这里插入图片描述

  • 启动类加载器(由C++编写):负责加载 JAVA_HOME\lib 目录中的类
  • 扩展类加载器:负责加载 JAVA_HOME\lib\ext 目录中的类
  • 应用程序类加载器:负责加载用户路径,即 classpath 上的类
  • 用户自定义加载器:继承ClassLoader重写findClass()方法,需求不复杂时直接继承URLClassLoader

4. 双亲委派机制

在这里插入图片描述

当一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一个层次类加载器都是如此,因此所有的加载请求都应该传送到启动类加载其中,只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的Class),子类加载器才会尝试自己去加载

优势:

  1. 保护程序安全,防止核心API被恶意篡改(沙箱安全机制)
  2. 避免类的重复加载