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 字节码 , 字节码附加信息 ;
Constant pool:#1 = Methodref#4.#17// java/lang/Object."":()V{public Student(); descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1// Method java/lang/Object." ":()V4: returnLineNumberTable:line 1: 0}
- 准备 : 在该阶段 , 在 方法区 中 , 为 类中的静态变量 进行内存划分 , 并对这些静态变量进行 默认值赋值 , 一般赋值 0 , null 等默认值 ; 即使静态变量 static int a = 5 已经有了赋值 , 但是在该阶段暂时给该静态变量赋值 0 ;
- 解析 : 将 " 常量池 " 中的 " 符号引用 " 转为 " 直接引用 " ;
Constant pool:#1 = Methodref#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 ;
总结 借助下图理解类加载过程 ;
文章图片
【java虚拟机原理:类加载过程详解】本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的等多内容!
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 做一件事情的基本原理是什么()
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 【读书笔记】贝叶斯原理
- 数组常用方法一
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- SG平滑轨迹算法的原理和实现
- Java|Java基础——数组