type
status
date
slug
summary
tags
category
icon
password
1. JVM 结构
2. JVM 类加载过程
- 加载
- 获取类的二进制字节流
- 将字节流的静态存储结构转化为方法区的运行时数据结构
- 在内存中生成java.lang.Class对象,作为这个类的访问入口
<hr>
连接
- 验证:确保加载的字节流信息符合虚拟机要求
- 验证文件格式、元数据、字节码、符号引用
- 准备:在方法区中为基本类型成员变量分配内存空间
- 根据基本变量类型,设置其对应的默认初始值
- 显示初始化被final修饰的变量(final变量在编译阶段时已被分配)
- 解析:将常量池中的符号引用替换为直接引用的过程
- 符号引用就是用符号描述所引用的目标,符号规范明确定义在Java虚拟机规范
- 直接引用可以是指向目标的指针、相对偏移量、能间接定位到目标的句柄
<hr>
- 初始化:执行类构造器 \<clinit>() 的过程
- \<clinit>()方法是根据类中的静态变量赋值动作和静态代码块语句自动定义的
- 若该类存在父类,JVM保证优先执行父类的\<clinit>()
3. 类加载器
- 启动类加载器(由C++编写):负责加载 JAVA_HOME\lib 目录中的类
- 扩展类加载器:负责加载 JAVA_HOME\lib\ext 目录中的类
- 应用程序类加载器:负责加载用户路径,即 classpath 上的类
- 用户自定义加载器:继承ClassLoader重写findClass()方法,需求不复杂时直接继承URLClassLoader
4. 双亲委派机制
当一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一个层次类加载器都是如此,因此所有的加载请求都应该传送到启动类加载其中,只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的Class),子类加载器才会尝试自己去加载
优势:
- 保护程序安全,防止核心API被恶意篡改(沙箱安全机制)
- 避免类的重复加载
- Author:风之旅人
- URL:https://www.hrmi.fun//article/jvm-ljzjz
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!