Lazy loaded image
技术分享
JVM-类加载机制
00 min
2019-5-17
2024-11-25
type
status
date
slug
summary
tags
category
icon
password

1. JVM 结构

notion image

2. JVM 类加载过程

notion image
  • 加载
  1. 获取类的二进制字节流
  1. 将字节流的静态存储结构转化为方法区的运行时数据结构
  1. 在内存中生成java.lang.Class对象,作为这个类的访问入口
<hr>
连接
  • 验证:确保加载的字节流信息符合虚拟机要求
  1. 验证文件格式、元数据、字节码、符号引用
  • 准备:在方法区中为基本类型成员变量分配内存空间
  1. 根据基本变量类型,设置其对应的默认初始值
  1. 显示初始化被final修饰的变量(final变量在编译阶段时已被分配)
  • 解析:将常量池中的符号引用替换为直接引用的过程
  1. 符号引用就是用符号描述所引用的目标,符号规范明确定义在Java虚拟机规范
  1. 直接引用可以是指向目标的指针、相对偏移量、能间接定位到目标的句柄
<hr>
  • 初始化:执行类构造器 \<clinit>() 的过程
  1. \<clinit>()方法是根据类中的静态变量赋值动作和静态代码块语句自动定义的
  1. 若该类存在父类,JVM保证优先执行父类的\<clinit>()

3. 类加载器

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

4. 双亲委派机制

notion image
当一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一个层次类加载器都是如此,因此所有的加载请求都应该传送到启动类加载其中,只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的Class),子类加载器才会尝试自己去加载
优势:
  1. 保护程序安全,防止核心API被恶意篡改(沙箱安全机制)
  1. 避免类的重复加载
 
上一篇
JVM-运行时数据区
下一篇
SpringMVC