Java虚拟机会屏蔽与特定操作系统平台有关的信息,这会促使Java程序在Java虚拟机上运行,而不需要修改。本文是针对虚拟机中的类加载过程:装载,验证,准备,解析,初始化五个过程来为大家分析。
加载
在装入阶段,将把class文件读到内存中,然后创建一个java.lang.class对象。此流程虚拟机主要完成三项工作:
1.根据类的全限名称获得定义此类的二进制字节流。
2.将此字节流表示的静态存储结构转换成方法区域的运行时数据结构。
3.在Java堆中生成代表该类的java.lang.Class对象,以访问方法区域数据。
验证
在链接的第一步中,验证阶段确保Class文件的字节流包含符合JVM规范的信息,并且不会对JVM造成危害。如果验证失败,则抛出一个java.lang.VerifyError异常或者它的子类异常。确认过程分四个阶段。
1.文件格式化验证:验证字节流文件是否符合Class文件格式规范,当前虚拟机可以正确地处理它。
2.Metadata验证:是对字节码所述信息进行语义分析,以确保所描述的信息符合Java语言的规格。
3.字节码验证:主要分析数据流和控制流,确保校验类的方法在运行时不会危及虚拟机。
4.符号引用验证:当虚拟机将符号引用转换成直接引用时,就会在解析阶段进行此转换操作。
准备
预备阶段分配变量的内存,并设置类变量的初始化。这一阶段分配的只是类的变量(static修改过的变量),没有包含类的实例变量。对于非final变量,JVM会将该变量设置为“零值”,而非其赋值语句的值:
pirvatestaticintsize=12;
因此,size的值是0,而不是12。final修饰过的类变量会被赋为真正的值。
解析
分析过程是将常量池中的符号引用替换为直接引用。首先分析四类引用类型。解析类或接口,字段解析,方法解析,接口方法解析。
初始化
在预备阶段,类变量一次就被初始化了,在这一阶段,就是根据程序开发的程序来初始化类的变量和其它资源。这是static{}块、构造函数、父类的初始化等等。
对于使用阶段和卸载阶段,这里不再多说了,使用过程是按照程序定义的行为来执行,由GC进行卸载。
使用
新线程---程序计数器----jvm栈执行(对象参考)-----堆内存(直接参考)----方法区域。
卸载
GC垃圾回收。
双重委托机制,意义,方法。
机制
引导(Bootstrap)类加载程序---->系统(System)类加载程序---->系统(System)类加载器---->上下文(Custom)类加载程序从左到右加载:首先将加载任务委派给父类加载器,按顺序递归,如果父类装入程序能够完成类装入任务,则返回成功;只有父类装入程序不能完成,只是自己去装。
意义
避免相同的字节码在内存中出现。
有了代理机制,就会递归地向父类查找,如果类A被类B引用,Java虚拟机会使用装入类A的类装入程序来装入类B,如果A装入程序已经装入类A,那么B用A的类装入器装入B,就不会装入类A。
方法
引导(Bootstrap)类装入程序。
标准件(Extension)类装入程序。
Application类装入器(Application)
内容(Custom)类装入器。
Java程序设计语言,是目前国内应用最多的编程语言之一。这里面包含了很多知识要点。JVM虚拟机是一种抽象的机器,它可以运行所有java程序,也可以运行Java语言。若要进行java相关的开发工作。确保完全掌握JVM虚拟机技术。