类加载的过程
1)加载阶段虚拟机完成的事情
1,通过一个类的全限定名来获取定义此类的二进制字节流。
2,将这个字节流所代表的静态存储结构转换为方法区的运行时数据结构
3,在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据 访问的入口。
2)验证的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
1,文件格式验证,验证字节流是否符合Class文件格式的规范,并且能被当前版本的虚拟机处理
2,元数据验证,对字节码描述的信息进行语义的分析,以保证其描述的信息符合Java语言规范的要求。主要目的是语义检查
3,字节码的验证,通过对数据流和控制流分析,确定程序语义是合法的、符合逻辑的,在第二阶段对元数据信息中的数据类型做完校验后,这个阶段将对类的方法体进行校验分析,保证被校验类的方法在运行时不会做出危害虚拟机的安全事件。
4,符号引用验证,这一阶段的校验发生在虚拟机将符号引用转换为直接引用的时候,这个转化动作将在连接的第三阶段----解析阶段中发生。目的是确保解析动作能正常执行,如果无法通过符号引用验证,那么将会抛出一个异常。
3)准备阶段,正式为类变量(static修饰的变量)分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区进行分配。这里所说的初始值通常情况下是数据类型的零值。
4)解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。
1,符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。
2,直接引用:直接引用可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。直接引用与虚拟机实现的内存布局相关,同一个符号引用在不同虚拟机实例上翻译出来的直接引用一般不会相同。
前面的类加载过程中,除了在加载阶段用户应用程序可以通过自定义类加载器参与外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的java程序代码(字节码)。
5)初始化,根据程序员通过程序制定的主观计划去初始化类变量和其他资源,初始化阶段是执行类构造器<clinit>()方法的过程
1)加载阶段虚拟机完成的事情
1,通过一个类的全限定名来获取定义此类的二进制字节流。
2,将这个字节流所代表的静态存储结构转换为方法区的运行时数据结构
3,在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据 访问的入口。
2)验证的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
1,文件格式验证,验证字节流是否符合Class文件格式的规范,并且能被当前版本的虚拟机处理
2,元数据验证,对字节码描述的信息进行语义的分析,以保证其描述的信息符合Java语言规范的要求。主要目的是语义检查
3,字节码的验证,通过对数据流和控制流分析,确定程序语义是合法的、符合逻辑的,在第二阶段对元数据信息中的数据类型做完校验后,这个阶段将对类的方法体进行校验分析,保证被校验类的方法在运行时不会做出危害虚拟机的安全事件。
4,符号引用验证,这一阶段的校验发生在虚拟机将符号引用转换为直接引用的时候,这个转化动作将在连接的第三阶段----解析阶段中发生。目的是确保解析动作能正常执行,如果无法通过符号引用验证,那么将会抛出一个异常。
3)准备阶段,正式为类变量(static修饰的变量)分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区进行分配。这里所说的初始值通常情况下是数据类型的零值。
4)解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。
1,符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。
2,直接引用:直接引用可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。直接引用与虚拟机实现的内存布局相关,同一个符号引用在不同虚拟机实例上翻译出来的直接引用一般不会相同。
前面的类加载过程中,除了在加载阶段用户应用程序可以通过自定义类加载器参与外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的java程序代码(字节码)。
5)初始化,根据程序员通过程序制定的主观计划去初始化类变量和其他资源,初始化阶段是执行类构造器<clinit>()方法的过程