学习导图
一.为什么要学习类加载机制?
今天想跟大家唠嗑唠嗑Java的类加载机制,这是Java的一个很重要的创新点,曾经也是Java流行的重要原因之一。
Oracle当初引入这个机制是为了满足JavaApplet开发的需求,JVM咬咬牙引入了Java类加载机制,后来的基于Jvm的动态部署,插件化开发包括大家热议的热修复,总之很多后来的技术都源于在JVM中引入了类加载器。
如今,类加载机制也在各个领域大放异彩,在面试中,由类加载机制所衍生出来各类面试题也层出不穷。
所以,我们要了解下类加载机制,为工作中或者是面试中实际的需要打好良好的基础。
二.核心知识点归纳
2.1概述
Q1:JVM类加载机制定义:
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可被虚拟机直接使用的Java类型的过程
Q2:特性
运行期类加载。即在语言里面,类型的加载、连接和初始化过程都是在程序运行期完成的,从而通过牺牲一些性能开销来换取Java程序的高度灵活性
什么是运行期,什么是编译期?
编译期是指编译器将源代码翻译为机器能识别的代码,Java被编译为Jvm认识的字节码文件,运行期则是指Java代码的运行过程
JVM运行期动态加载+动态连接-Java的动态扩展特性
2.2类加载的过程
类从被加载到虚拟机内存中开始、到卸载出内存为止,整个生命周期包括七个阶段:
加载验证准备解析初始化使用卸载其中,验证、准备、解析这3个部分统称为连接,流程如下图:
注意:
『加载』-『验证』-『准备』-『初始化』-『卸载』这五个阶段的顺序是确定的,而『解析』可能为了支持Java的动态绑定会在『初始化』后才开始上述阶段通常都是互相交叉地混合式进行的,比如会在一个阶段执行的过程中调用、激活另外一个阶段想要了解Java动态绑定和静态绑定区别的话,可以看下这篇文章:理解静态绑定与动态绑定
2.2.1加载
Q1:任务
通过类的全限定名来获取定义此类的二进制字节流。如从ZIP包读取、从网络中获取、通过运行时计算生成、由其他文件生成、从数据库中读取等等途径......想要详细了解类的全限定名的知识,可以看下这篇文章:全限定名、简单名称和描述符是什么东西?
将该二进制字节流所代表的静态存储结构转化为方法区的运行时数据结构,该数据存储数据结构由虚拟机实现自行定义在内存中生成一个代表这个类的java.lang.Class对象,它将作为程序访问方法区中的这些类型数据的外部接口2.2.2验证
是连接阶段的第一步,且工作量在JVM类加载子系统中占了相当大的一部分目的:为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全由此可见,它能直接决定
JVM能否承受恶意代码的攻击,因此验证阶段很重要,但由于它对程序运行期没有影响,并不一定必要,可以考虑使用
-Xverify:none
参数来关闭大部分的类验证措施,以缩短虚拟机类加载的时间。检验过程包括下面四个阶段:A.文件格式验证:B.元数据验证:C.字节码验证:D.符号引用验证:内容:对类自身以外(如常量池中的各种符号引用)的信息进行匹配性校验目的:确保解析动作能正常执行,如果无法通过符号引用验证,那么将会抛出一个java.lang.In