一个java文件从编码到完成到最终执行包含两个过程:
编译
就是把java文件通过javac命令编译成字节码文件,也就是class文件;
运行
就是把class文件交给java虚拟机执行。
类加载机制
jvm把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可被虚拟机直接使用的java类型,这就是java的类加载机制。
类加载过程
类加载的过程主要分为三个部分:
加载
在加载阶段,虚拟机需要完成以下3件事情:
1.通过一个类的全限定名来获取定义此类的二进制字节流
2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3.在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
连接
连接又分为验证,准备,解析三个部分
验证(非必须的)
目的:是为了确保Class文件的字节流包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全,包含以下步骤:
文件格式验证
验证字节流是否符合Class文件格式的规范,并且能背当前版本的虚拟机处理
元数据验证
对字节码描述的信息进行语义分析,确保描述的信息符合java语言规范
字节码验证
通过数据流和控制流分析,确定程序的语义是合法的,符合逻辑的
符号引用验证
会发生在虚拟机将符号引用转化为直接引用的时候,确保解析动作能正常运行
准备
准备阶段是正式为类变量分配内存并设置类变量初始值(0)的阶段
解析
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程
主要针对类或接口,字段,类方法,接口方法,方法类型,方法句柄和调用点限定符7类
初始化
初始化阶段根据程序员的主管计划去初始化变量和其他资源,或者说初始化阶段是执行类构造器《clinit》方法(编译器自动收集类中的所有类变量的赋值动作和静态语句块的语句合并产生的)的过程。