jvm执行简图:
类加载子系统 作用:负责从文件系统或在网络中加载class文件,class文件开头有特定的标识
class loader只负责加载class文件,至于文件是否可以执行由Execution Engine(执行引擎:解释器、JIT、GC)决定。加载的类信息保存在方法区中,除了类信息外,方法区还会存放运行时常量池信息
阶段:加载(引导类加载器、扩展类加载器、系统类加载器、自定义加载器)->链接(验证、准备、解析)->初始化
加载:
1、通过类的全限定名获取定义此类的二进制字节流
2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3、在内存中生成一个class对象(保存在堆中),作为方法区这个类的各种数据的访问入口
链接:
1、验证:
确保加载的class文件的字节流中包含的信息符合当前虚拟机的要求,保证加载类
的正确性,主要包括四种验证:文件格式验证、元数据验证、字节码验证、符合引
用验证。比如class文件头部的CA FE BA BE
2、准备:
为类变量分配内存空间并且设置该类型变量的默认初始值(如int 赋值为0)
这里不包含使用final修饰的static,因为final在编译的时候就会分配,准备阶段会显
示的初始化(赋值具体的值)。不会为实例变量分配初始化,类变量会分配在方法
区中,而实例变量是随着对象一起分配到java堆中
3、解析
将常量池内的符号引用转换为直接引用的过程事实上。
解析操作往往会伴随着JVM在执行完初始化之后再执行。
符号引用就是一组符号来描述所引用的目标符号引用的宇面量形式明确定义在
《java虛拟机规范》的Class文件格式中。直接引用就是直接指向目标的指针、相
对偏移量或一个间接定位到目标的句柄。
解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等
初始化:
初始化阶段就是执行类构造器方法
此方法不需定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块
中的语句合并而来。如果类中没有相应操作就不会生成clinit()方法。
构造器方法中指令按语句在源文件中出现的顺序执行
若该类具有父类,JVM会保证子类的
虚拟机必须保证一个类的



