java类加载过程
加载
将字节码数据从不同的数据源读取到 JVM 中,并映射为 JVM 认可的数据结构(Class 对象)
1、通过一个类的全限定名来获取定义此类的二进制字节流
2、将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构
3、在内存中生成一个代表这个类的java.lang.Class类,作为方法区这个类的各种数据的访问入口
验证
确保Class文件的字节流中包含的信息符合java虚拟机规范的全部约束要求,保证这些信息被当做代码运行后不会危害虚拟机自身的安全
1、文件格式验证
验证字节流是否符合Class问价格式的规范,并且能被当前版本的虚拟机处理
2、元数据验证
对字节码描述的信息进行语义分析,以保证其描述的信息符合java语言规范的要求
3、字节码验证
通过数据流分析和控制流分析,确定程序语义是合法的、符合逻辑的,保证被校验类的方法在运行时不会做出危害虚拟机安全的行为
4、符号引用验证
对类自身以外的各类信息进行匹配性校验,查看该类是否缺少或者被禁止访问它依赖的某些外部类、方法、字段等资源,确保解析行为能正常执行
准备
正式为类中定义的变量(即静态变量)分配内存并设置类变量初始值(零值)的阶段
解析
java虚拟机将常量池内的符号引用替换为直接引用
初始化
java虚拟机执行类中编写的java程序代码,将主导权移交给应用程序