JAVA八股学习笔记-类加载机制
类加载机制是把类加载到JAVA虚拟机(JVM)中的一种机制。
类加载机制分为装载,链接,初始化三个部分。
其中链接又分为验证,准备以及解析三个阶段。
装载:查找和导入class文件
(1)通过一个类的全限定名获取定义此类的二进制字节流。
全限定名是指在编程中,用于唯一标识一个类或接口的完整名称。如java.util.class。
(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
静态存储结构是指在程序编译期间为变量分配固定的存储单元,并在整个程序运行期间保持不变,直到程序结束后释放。这种存储方式适合全局变量和静态局部变量。
运行时数据结构是程序在执行期间用于存储和管理数据的区域。
(3)在JAVA堆中生成一个代表这个类的java.util.class对象,作为对方法区中这些数据的访问入口。
链接-验证
验证这个文件(格式、数据等)是完全正确的。
分为文件格式验证、元数据验证、字节码验证和符号引用验证。
文件格式验证:确保字节码文件符合Class文件格式规范;
元数据验证:验证字节码中元数据是否符合JAVA语言规范,如类、方法和字段的定义;
字节码验证:确保字节码的指令序列合法,如跳转指令的目标是否有效,堆栈和局部变量表的操作是否规范;
符号引用验证:确保符号引用的合法性,如方法调用的参数和返回值是否匹配。
链接-准备
为类的静态变量分配内存,并将其初始化为默认值。
链接-解析
将类中的符号引用转换为直接引用。
符号引用是用一组符号来描述目标,可以是任何形式的字面量。通俗点讲,在图书馆找书时,你没有具体的书架位置,只知道它的作者和书名,这里的作者和书名就是符号引用。
直接引用是一种直接指向目标对象、类、字段或方法在JVM内存中的物理位置的引用方式,如指针、偏移量等。通俗点讲,在图书馆中你在借阅台根据作者和书名找到了那本书的具体位置,此时你就可以拿到书,这个具体位置就是直接引用。
初始化
初始化阶段是执行<clinit>()方法的过程。