1. class 文件
Class文件是一组以8位字节为基础单位的二进制流,类似于结构体的伪结构来存储数据:
- 只有两种数据类型:无符号数和表,无符号数属于基本的数据类型,以u1、u2、u4、u8。
- 表是由多个无符号数或者其他表作为数据项构成的复合数据类型。
class 文件结构详解:
- 魔数与Class文件的版本
- 常量池
- 访问标志
- 类索引、父类索引与接口索引集合
- 字段表集合
- 方法表集合
- 属性表集合
2. 字节码指令
指令分类:
- 加载和存储指令
- 运算指令
- 类型转换指令
- 对象创建与访问指令
- 操作数栈管理指令
- 控制转移指令
3. 字节码解释执行引擎
JVM 字节码解释执行引擎是基于栈的指令集。另外还有基于寄存器的指令集,但不是 JVM 用的。
4. JVM 层面方法调用
分派有:
- 静态分派
- 动态分派
静态分派一般是重载,动态分派一般是多态。
静态分派是:
动态分派是:
动态分配的实现:
JVM 中有虚方法表,父类方法如果被改写,则指向子类自己的方法。
5. 类加载机制
5.1 类加载过程
5.2 类加载器
1. 双亲委派模型
加载过程:
某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
好处:
java 类随着它的类加载器一起具备了带有优先级的层次关系,保证 java 程序稳定运行。
自定义类加载器时只需要重写 findClass 即可,重写 loadClass 需要自己加上双亲委派机制。
5.3 Tomcat 类加载机制
Tomcat 容器下的两个应用都有 UserServiceImpl,如何保证类的隔离:
每加载一个应用时,Tomcat 会 new 一个 WebApp 类加载器,WebApp 类加载器重写了 loadClass,里面没有双亲委派机制。