加载=>验证=>准备=>解析=>初始化 5个阶段所执行的具体动做java
在加载阶段,虚拟机须要完成3个事情
1.经过一个类的全限定名获取定义此类的二进制字节流
2.将这个字节流所表明的静态存储结构转化为方法区的运行时数据结构
3.在内存中生成一个表明这个类的 java.lang.class 对象,做为方法区这个类的各类数据的访问入口程序员
相对于类加载过程的其余阶段,一个非数组类(数组类是由jvm虚拟机直接建立的)的加载过程(加载阶段获取类的二进制字节流的动做)是开发人员可控性最强的,由于加载阶段可使用系统提供的引导类加载器去完成,也能够有开发人员自定义的类加载器去完成,开发人员能够经过定义本身的类加载器去控制字节流的获取方式(重写一个类加载器的loadClass()函数)。数组
加载阶段和链接阶段的部份内容是交叉进行的(如一部分字节码文件的验证动做),加载阶段还没有完成,链接阶段可能已经开始,可是这些夹在加载阶段进行之中的动做,仍然属于链接阶段的内容,这两个阶段的开始时间仍然保持固定的前后顺序。安全
验证是链接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,而且不会危害虚拟机本身的安全。数据结构
java语音自己是相对安全的语音,若是遇到异常代码(指没法经过语法检查的代码),编译器是拒绝编译的,可是全部Class文件并不必定是按照java源码编译来的,甚至能够用十六进制编辑器直接修改产生的Class文件,虚拟机若是不检查输入的字节流,而对其彻底信任的话,可能载入了有害的字节流而致使系统崩溃,这是咱们没法接受的,因此验证是虚拟机对真身保护的一项重要工做
1.文件格式验证
第一阶段要验证字节流是否符合Class文件格式规范,而且能被当前版本的虚拟机处理。
2.元数据验证
第二阶段是对字节码描述的信息进行语义化分析,以保证其描述的信息符合java语音规范的要求。
3.字节码验证 第三阶段是整个验证过程当中最复杂的阶段,主要是经过数据流和控制流分析,肯定程序语义是合法的,符合逻辑的。这个阶段会对类的方法体进行校检分析,确保在方法运行的时候不能作出危害虚拟机安全的时间。
4.符号引用验证 最后一个阶段的校检发送在虚拟机将符号引用转化为直接引用的时候,这个转化动做将在链接阶段的第三个阶段,解析阶段中发生。jvm
准备阶段是正式为类变量分配内存并设置为初始值的阶段(该阶段仅将变量设置为初始值,而并不是赋值),这些变量所使用的内存都将在方法区中进行分配,这个时候进行的内存分配的仅包括类变量(static修饰的变量),而不包括实例变量,实例变量将会在对象实例化的时候随着对象一块儿分配在java堆中。并且这里所说的初始化一般指数据类型的零值。编辑器
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,主要包括四种类型引用的解析。类或接口的解析、字段解析、方法解析、接口方法解析。函数
java会编译(相似编译过程)会把类文件(.java)编译成class文件(.class),可是这个过程当中若是A类须要引用B类,因为没有加载入内存执行,因此他并不知道B类的地址,所以用符号代替,即为符号引用。到执行程序时会加载类,相关类会进入内存,所以能够就有了内存地址,A类就能够将符号引用映射带B类地址,就是直接引用了!
类初始化阶段是类加载过程的最后一步,前面的类加载过程当中,除了在加载阶段开发人员能够用自定义类加载 器参与以外,其余动做都是有虚拟机主导和控制的,到了初始化阶段,才真正开始执行类中定义的java程序代码。
在准备阶段,变量已经付过一次初始值,而在初始化阶段,则根据程序员的代码来进行赋值,初始化阶段是执行类的构造器赋值的。这些资源有static{}块,构造函数,父类的初始化等。spa
至于使用和卸载阶段阶段,这里再也不过多说明,使用过程就是根据程序定义的行为执行,卸载由GC完成。