做网站网站的代理算网站罪吗,广宁住房和城乡建设局网站,厦门模板建站,济源网站建设费用文章目录 类加载机制类加载过程1. 加载2. 验证3. 准备4. 解析偏移量符号引用和直接引用 5. 初始化 类加载机制
类加载指的是#xff0c;Java 进程运行的时候#xff0c;需要把 .class 文件从硬盘读取到内存#xff0c;并进行一些列的校验解析的过程#xff08;程序要想执行… 文章目录 类加载机制类加载过程1. 加载2. 验证3. 准备4. 解析偏移量符号引用和直接引用 5. 初始化 类加载机制
类加载指的是Java 进程运行的时候需要把 .class 文件从硬盘读取到内存并进行一些列的校验解析的过程程序要想执行就得进入内存
.class 文件类对象硬盘内存
类加载过程
类加载的过程其实是在 Java 官方文档中给出的说明
加载找到. class 文件并且读文件内容验证校验 .class 文件的格式是否符合 JVM 规范要求准备给类对象分配内存此时内存空间全是 0 的类的静态成员也就是全 0 的值解析针对类中的字符串常量进行处理把类对象的各个属性进行赋值填充触发对父类的加载初始化静态成员执行静态代码块 类加载大体的过程可以分为五 个步骤也有资料上说是三个这个情况就是把 2,3,4 合并成一个了
1. 加载
把硬盘上的 .class 文件找到打开文件读取到文件内容认为读到的是二进制的数据
找文件这里还有点幺蛾子后面再说
2. 验证
当前需要确保读到的文件的内容是合法的 .class 文件字节码文件格式
具体的验证依据在 Java 虚拟机规范中有明确的格式说明 https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html 这里的描述方式类似与 C语言的结构体
前面一列是属性的类型后面一列是属性的名字u4 就是 4 个字节的无符号整数
magic
magic 也叫做 magic number魔幻数字。广泛应用于二进制文件格式中用来标识当前二进制文件的格式是哪种类型 二进制文件是一个非常广泛的话题。mp3、mp4 是二进制你图片也是二进制你一个可执行程序也是二进制你一个 .class 文件也是二进制。不同的二进制在使用和解析的时候肯定是存在一些差别的 所以我们一般就会在二进制文件开头指定一个固定的“魔幻数字”通过这个数字对这个文件类型进行区分
minor/major_version
minor_version次版本major_version主版本
平时说 Java 8917… 平时表达的时候使用的版本实际上 JVM 开发过程中内部还有版本通过 minor/major_version 进行表示
JVM 执行 .class 文件对的时候就会验证版本是否符合要求。如果版本不兼容就无法执行。一般来说高版本的 JVM 可以运行低版本的 .class反之不一定能行
3. 准备
给类对象申请内存空间
此时申请到的内存空间里面的默认值都是全 0 的。这个阶段中类对象里的静态成员变量的值也就相当于是 0
4. 解析
主要是针对类中的字符串常量进行处理
解析阶段是 Java 虚拟机将常量池的符号引用替换为直接引用的过程也就是初始化常量的过程
偏移量
class Test {private String s hello;
}在 .class 文件中会有一个部分用来存储“hello”这个字符串常量常量池里面上面验证的格式里面包含了还有一个空间对应着 s 这个变量 在上述代码中我们很明显的知道s 变量里面相当于保存了“hello”字符串常量的地址。但是在文件中不存在“地址”这样的概念。谈到地址就是“内存”的地址我们是文件是硬盘硬盘没有地址的概念虽然没有地址但是可以存储一个类似于地址的“偏移量”文件开头到“hello”的距离这样的概念用来描述这个数据的位置
符号引用和直接引用
此处文件中填充给 s 的“hello”的偏移量就可以认为是“符号引用”。接下来要把 .class 文件加载到内存中就会先把“hello”这个字符串加载到内存中此时“hello”就有地址了。
之后 s 里面的值就可以替换成当前“hello”真实的地址了直接引用 本来在文件中存储的并非是一个真实的地址而是一个标记偏移量我们回到内存中后我们就可以把这个数据的存储换成真实的地址了 5. 初始化
针对类对象完成后续的初始化 还要执行静态代码块的逻辑还可能会触发父类的加载