上饶婚纱工作室网站建设,部门网站建设的工作领导小组,免费网站推广app,计算机应用技术网站开发介绍前言#xff1a; 今天和大家探讨一道Java中经典的面试题#xff0c;这道面试题经常出现在各个公司的面试中#xff0c;结合周志明#xff0c;老师的《深入理解Java虚拟机》书籍#xff0c;本篇文章主要讲解Java类加载机制的知识。该专栏比较适合刚入坑Java的小白以及准备秋…前言 今天和大家探讨一道Java中经典的面试题这道面试题经常出现在各个公司的面试中结合周志明老师的《深入理解Java虚拟机》书籍本篇文章主要讲解Java类加载机制的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。
如果文章有什么需要改进的地方欢迎大佬提出对大佬有帮助希望可以支持下哦~
小威在此先感谢各位小伙伴儿了 以下正文开始 文章目录 类加载步骤加载验证文件格式验证元数据验证字节码验证符号引用验证 准备解析初始化 类加载步骤
在Java的类加载过程中加载Loading、验证Verification、准备Preparation、解析Resolution和初始化Initialization是五个关键步骤。后续的使用和卸载这两个步骤就不做过多赘述啦毕竟也不是面试中的重点。 加载
JVM在进行类加载的时候第一个阶段名字叫做加载。
加载阶段是通过类的全限定名来定位并加载对应的字节码数据。这个过程由类加载器完成的别小看这小小的加载阶段它也包含几个步骤下面先着重介绍一些它 首先它是通过类的全限定名查找字节码数据的来源的可以是本地文件系统、网络、JAR包等。 其次它将字节码数据读入内存并创建一个代表该类的Class对象。 在堆中为该类的静态变量分配内存空间。注意是静态变量哦 验证
正在向我们走来的是第二步第二步骤会做些什么呢在验证阶段虚拟机会对被加载的类进行各种验证操作以确保被加载的类的字节码符合Java虚拟机规范的要求同时保证安全性。验证操作同样包括几个小步骤。
文件格式验证
在文件格式验证阶段中Java虚拟机会验证字节码文件是否符合Class文件格式的规范。下面说一下这个详细过程
首先是校验魔数在Java的字节码文件中前4个字节被叫做魔数(它的唯一作用就是确定这个文件是否是一个能被虚拟机接受的Class文件)检查字节码文件的前4个字节是否为固定的0xCAFEBABE。
第二就是校验版本号也就是验证字节码文件的主版本号和次版本号是否在虚拟机所支持的范围内。
第三是校验常量池验证常量池中的各个常量是否符合规范。 元数据验证
在元数据验证阶段虚拟机会检查类的字节码是否符合Java语言规范的语义要求。
这里我们讨论下这个部分究竟是验证的神马
验证是否所有的类都有父类除了java.lang.Object外其他类必须有一个直接父类。验证是否所有的非抽象类都实现了其声明的所有接口方法确保类实现了它所声明的所有接口方法。验证是否所有的字段和方法符合访问权限约束比如私有成员只能在本类内部访问。验证是否存在不兼容的方法重载不允许出现两个或多个参数类型和返回值类型完全相同但方法名称不同的方法。
字节码验证
在字节码验证这个阶段虚拟机会对字节码进行详细的验证确保类的字节码操作符合Java虚拟机规范。在这个阶段它会进行这几个验证
操作数栈验证每个字节码指令都有明确的操作数栈行为规定虚拟机会检查操作数栈是否符合指令的要求。局部变量表验证虚拟机会检查字节码指令对局部变量表的读写是否正确。类型检查验证虚拟机会验证字节码指令中的类型转换是否合法。
符号引用验证
在符号引用验证这个阶段主要做的是虚拟机会验证符号引用中的类、字段和方法是否存在、可访问等。比如
类验证验证被引用的类是否已经被加载且满足访问权限的限制。字段验证验证被引用的字段是否存在且满足访问权限的限制。方法验证验证被引用的方法是否存在且满足访问权限和方法调用约束的限制。 准备
准备阶段是为类的静态变量分配内存空间并设置默认初始值 这里注意是静态变量默认初始值哈 。它的具体操作包括 在方法区中为类的静态变量分配内存空间。 设置静态变量的默认初始值例如数值类型为0引用类型为null。 解析
解析阶段将常量池中的符号引用替换为直接引用。在Java虚拟机中符号引用是一种编译时的引用它与虚拟机实现无关。而直接引用是指直接指向内存位置的指针、句柄或偏移量等可以被虚拟机直接使用。
解析操作包括哪些解析呢请看下面
类或接口的解析将常量池中的类或接口符号引用解析为对应的直接引用。字段解析将常量池中的字段符号引用解析为对应的直接引用。方法解析将常量池中的方法符号引用解析为对应的直接引用。 初始化
初始化阶段是类加载过程的最后一步除去使用和卸载哈~这一步负责执行类的初始化操作包括静态变量赋值和静态代码块的执行。初始化操作按顺序执行并且只会执行一次。
初始化操作包括这些
静态变量赋值按照代码中的赋值操作为类的静态变量赋初值。静态代码块执行执行类中的静态代码块可以在其中进行复杂的初始化操作例如读取配置文件、创建单例对象等。
类的初始化是在首次主动使用该类时触发的主动使用包括创建类的实例、访问类的静态变量或静态方法、调用类的反射方法等。
讲到这里笔者终于肝完了泪目 文章到这里就先结束了感兴趣的可以订阅专栏哈后续会继续分享相关的知识点。