java虚拟机原理:类加载过程详解

网友投稿 205 2022-09-29


java虚拟机原理:类加载过程详解

目录一、java 类加载过程1、字节码编译2、加载3、连接4、初始化总结

一、Java 类加载过程

1、字节码编译

编写好 Java 源码 Student.java ,

使用 javac 将上述 Java 源码编译成 Class 字节码文件 Student.class ,

2、加载

加载 : 通过 " 类加载子系统 " 将该字节码文件 , 加载到 Java 虚拟机内存中 的 方法区 , 然后开始执行 " 连接 " 操作 ,

类加载时机 : Java 程序执行时 , 并不是一开始将所有的字节码文件都加载到内存中 , 而是用到时才进行加载 ;

通过 new 关键字创建实例对象 ;

通过 Class 反射 获取类 ;

如 : Class.forName(“Xxx”) 获取类 ;

序列化 / 反序列化 ;

调用 clone 克隆对象 ;

有 main 函数的类 , 会默认自动加载 ;

调用子类 , 如果之前没有加载过父类 , 则 自动加载父类 ;

3、连接

连接操作 分为 3 3 3 个步骤 :

验证 : 对 字节码文件 进行校验 , 查看该字节码格式是否正确 , 如 : 是否以 0xCAFEBABE 开头 , 字段表 , 方发表 , 属性表 等格式是否正确 , 进行校验 ;

校验示例 : 假设校验如下字节码数据 , 原始数据是 【Java 虚拟机原理】Class 字节码二进制文件分析 一 ( 字节码文件附加信息 | 魔数 | 次版本号 | 主版本号 | 常量池个数 ) 二、字节码文件示例 章节中的 Java 源码 , Class 字节码 , 字节码附加信息 ;

在 Student 构造方法中 , 会调用到 1: invokespecial #1 父类构造方法 , 如果父类有有参的构造方法且没有声明无参构造方法 , 子类必须实现一个相同参数的构造方法 , 否则就会报错 ;

Constant pool:

#1 = Methodref #4.#17 // javaDgGxXtDU/lang/Object."":()V

{

public Student();

descriptor: ()V

flags: ACC_PUBLIC

Code:

stack=1, locals=1, args_size=1

0: aload_0

1: invokespecial #1 // Method java/lang/Object."":()V

4: return

LineNumberTable:

line 1: 0

}

准备 : 在该阶段 , 在 方法区 中 , 为 类中的静态变量 进行内存划分 , 并对这些静态变量进行 默认值赋值 , 一般赋值 0 , null 等默认值 ; 即使静态变量 static int a = 5 已经有了赋值 , 但是在该阶段暂时给该静态变量赋值 0 ;

解析 : 将 " 常量池 " 中的 " 符号引用 " 转为 " 直接引用 " ;

符号引用 : 下面就是 常量池中的 符号引用 , 引用是 以符号的形式表示出来 的 , 这并不是内存中的引用 ; 直接引用 是 将 #1 = Methodref #4.#17 样式的 符号引用 转为 指向内存地址 的 指针引用 ; JVM 线程栈 的 栈帧 中的 动态链接 , 就是持有的一个指向内存的指针 , 该指针指向 栈帧 对应方法 在运行时 常量池中的 内存地址 ; 该内存地址是在 方法区 中的 ;

Constant pool:

#1 = Methodref http:// #4.#17 // java/lang/Object."":()V

#2 = Fieldref #3.#18 // Student.name:Ljava/lang/String;

#3 = Class #19 // Student

#4 = Class #20 // java/lang/Object

( 分析的数据是 【Java 虚拟机原理】Class 字节码二进制文件分析 一 ( 字节码文件附加信息 | 魔数 | 次版本号 | 主版本号 | 常量池个数 ) 二、字节码文件示例 章节中的 Java 源码 , Class 字节码 , 字节码附加信息 ; )

4、初始化

初始化 : 对变量进行 指定赋值 ;

如 : 有静态变量 static int a = 5 , 在 连接 过程中的 准备 阶段 , 为该变量赋值默认值 0 ; 在 初始化 阶段 , 为其赋值 代码 中设置的真正的 指定初始值 5 ;

总结

借助下图理解类加载过程 ;

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的等多内容!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:实力打榜 | 全息网御上榜《CCSIP 2022中国网络安全产业全景图(第四版)》(排位实力较强)
下一篇:5款实用的漏洞扫描工具,记得收藏!(最新漏洞扫描工具)
相关文章

 发表评论

评论列表