当前位置 博文首页 > 用心编码:深入理解JAVA虚拟机(一、类加载机制)
虚拟机把描述类的数据从Class文件或者字节码二进制流数据加载到JVM内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。
1.虚拟机通过一个类的全限定名来获取类的二进制字节流,Java虚拟机规范中并未明确指明类的二进制字节流只能来自于Class文件,这就给Java变成带来了很大的可扩展性,常见的获取java字节码二进制字节流的方式有以下几种:
2.虚拟机获取到类字节码后,将该字节流锁代表的静态存储结构转化为方法区运行时的数据结构,这里的方法区运行时数据结构是由Java虚拟机实现所决定的,不同的java虚拟机,其方法区数据结构都会不同。
3.在内存中生成一个代表这个类的 java.lang.Class 的对象,作为方法区这个类的所有数据的访问入口。java.lang.Class 可存储在虚拟机内存模型的堆或者方法区中,这由Java虚拟机实现所决定。
通过以上三步基本上就完成了 类的加载阶段。
验证阶段是虚拟机的一项重要的工作,保证了java代码在虚拟机中安全、稳步运行,主要是为了减少一些不安全,会损害虚拟机的java代码进入虚拟机,但是通过验证的java代码,也不代表着一定不会损害虚拟机。总之出去安全的考虑,在虚拟机加载后,会验证二进制字节码数据流是否符合虚拟机的要求。主要验证一下4部分内容:
二进制文件格式
编译阶段已经将java代码编译称为特定格式的class文件,class是二进制数据,主要验证二进制字节流中的 魔数、JDK版本、常量池信息等。只有通过了二进制文件格式验证的字节流数据才会被虚拟机存储于虚拟机的内存模型的方法区中。Class文件格式将在 <<深入理解JAVA虚拟机(二、Class文件结构)>>中详细阐述。
元数据
元数据验证是对虚拟机中方法区中的数据进行语义分,验证其是否符合java语言规范。主要是对类的定义、属性定义进行校验。
字节码
字节码验证是对虚拟机中方法区中的数据的类的方法、逻辑处理进行校验,这部分校验工作比较复杂,也是校验过程中比较耗费性能的一个过程,而且校验结果不完全准确,毕竟这一阶段是通过程序去校验程序的逻辑性,可能存在一些case没有考虑周到的情况。
符号引用
符号引用也就是在类中调用了一些其它类的方法、属性等操作,符号引用是验证直接引用是否可以通过类的全限定名进行引用的过程。在解析阶段会直接进行方法、字段、接口进行直接应用。
初始化5大场景(类没有初始化则会对类进行初始化)
注意:初始化指的是:如果该类没有被初始化,那么满足下面的条件后会对类进行初始化操作。
双亲委派模型(Parents Delegation Model)
未完待续…
1.类加载机制
2.类加载过程
3.类加载器