目录
一、三大商用 JVM
- HotSpot
- JRockit
- J9
二、整体结构
- 线程共享:方法区、堆
- 线程私有:虚拟机栈、本地方法栈、程序计数器
三、类加载器子系统
Ⅰ、加载阶段(双亲委派机制)
引导类加载器 | 扩展类加载器 | 系统类加载器 | 自定义类加载器 |
---|---|---|---|
C/C++ | Java | Java | Java |
没有父加载器 | 父加载器为引导类加载器 | 父加载器为扩展类加载器 | 父加载器为系统类加载器 |
加载核心类库 | 加载扩展类库 | 加载自定义类库 | 加载自定义类库 |
- 父加载器与子加载器不是继承关系
- JVM 规范将继承 ClassLoader 类的加载器(扩展类加载器、系统类加载器)都归为自定义类加载器
自定义类加载器
作用:
- 隔离加载类
- 修改加载方式
- 扩展加载源
- 防止源码泄露
步骤:
- 继承 ClassLoader 类
- 重写 findClass() 方法
双亲委派机制
双亲委派机制是一种任务委派的模式,在 JVM 按需加载 class 文件时,将请求交由父加载器处理
优势:
- 避免类被重复加载
- 防止核心类库被恶意篡改
Ⅱ、验证阶段
类型:
- 文件格式验证
- 元数据验证
- 字节码验证
- 符号引用验证
- ……
Ⅲ、准备阶段
为类变量分配内存并设置默认值(不包含被 final 修饰的类变量和实例变量,final 修饰的类变量在编译时分配内存)
Ⅳ、解析阶段
将常量池中的符号引用转换为直接引用
Ⅴ、初始化阶段
该阶段指执行类构造器 <clinit> 方法的过程(该方法无需定义,是 javac 编译器通过收集类中类变量的赋值动作和静态代码块中的语句而来)