JVM类加载过程
类加载过程三个阶段
- 加载
- 链接
- 初始化
加载过程
JVM类加载通过类加载器进行加载,类加载器分为引导类加载器,系统类加载器。
- 通过一个类的全限定名获取此类二进制字节流
- 将这个字节流所代表的静态存储结构转换为方法区的运行时数据结构
- 在内存中生成一个java.lang.Class的对象,作为方法区中访问这个类的各种数据的入口
链接过程
类的链接过程分成三个阶段
- 验证
- 准备
- 解析
验证
- 目的在于确保Class的字节码符合JVM的需求,保证被加载正确性,不会危害虚拟机的自身安全
- 主要包含四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证
准备
- 为变量分配内存并设置该变量初始值,零值
- 这里不包含final修饰的static,final修饰的在编译时已经分配,准备阶段会显示初始化
- 不会为实例变量分配初始化,类变量分配在方法去,而实例变量是会随着对象一起分配到Java堆中
解析
- 将常量池中的符号引用解析为直接引用
- 解析动作会会伴随着JVM执行完初始化在执行
初始化过程
- 初始化就是执行类构造器的()方法的过程
- 此方法不需要定义,javac在编译过程会收集所有类变量的赋值动作和静态代码块中的语句而来
- 构造器的方法与源文件中的顺序一致
- 若该类具有父类,则在子类的()执行前会执行父类的()