Class文件结构
- 8位字节作为基础单位
- 数据类型为无符号数和表
- 内容
- 前四位是魔数,代表是class文件,0xCAFEBABE
- 5到8位是版本号,再分为次版本号和主版本号,从45开始,版本向下兼容
- 接着是常量池入口
- 接着是访问标志,类,接口,abstract,等等
- 接着是类索引,父类索引,接口索引
- 接着是字段表集合
- 接着是方法表集合
- 属性表集合
类加载流程
加载
- 通过一个类的的全限定名来获取定义此类的二进制字节流
- 文件
- 网络(比如applet)
- 动态生成
- 其他存储
- 将这个字节流所代表的静态结构转化为方法去的运行时数据结构
- 在内存中生成已个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
验证
准备
解析
初始化
必须先初始化的操作
- new,putstatic,setstatic,staticinove
- 反射
- 初始化子类时父类必须先初始化
- 执行的时候指定的主类
执行内容
- 静态代码块执行
- 构造函数
- 父类的初始化优先
- 初始化会加锁同步,只会有一个线程可以执行
使用
卸载
类加载器
双亲委派模型
- 启动类加载器
- 扩展类加载器
- 应用程序类加载器
- 自定义类加载器
破坏双亲委派模型
字节码执行引擎
运行时栈帧结构
方法调用
tomcat类加载
- 启动类加载器
- 扩展类加载器
- 应用程序类加载器
- common类加载器
- Catalina类加载器
- Shared类加载器
- webapp类加载器
- jsp类加载器