【Java 虚拟机原理】Java 类加载过程 ( 加载 | 连接 - 验证 准备 解析 | 初始化 | 使用 | 卸载 )

本文详细阐述了Java类从字节码编译到加载、连接、初始化的全过程。在加载阶段,字节码文件被引入内存的方法区。连接包括验证、准备和解析三个步骤,验证确保字节码正确,准备阶段为静态变量分配内存并赋予默认值,解析将符号引用转换为直接引用。初始化阶段则是对静态变量进行指定值的赋值。整个过程确保了类的安全加载和正确执行。
摘要由CSDN通过智能技术生成





一、Java 类加载过程




0、字节码编译


编写好 Java 源码 Student.java ,

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


1、加载


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


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

  • 通过 new 关键字创建实例对象 ;
  • 通过 Class 反射 获取类 ; 如 : Class.forName(“Xxx”) 获取类 ;
  • 序列化 / 反序列化 ;
  • 调用 clone 克隆对象 ;
  • 有 main 函数的类 , 会默认自动加载 ;
  • 调用子类 , 如果之前没有加载过父类 , 则 自动加载父类 ;

2、连接


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

Constant pool:
   #1 = Methodref          #4.#17         // java/lang/Object."<init>":()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."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0
}
  • 准备 : 在该阶段 , 在 方法区 中 , 为 类中的静态变量 进行内存划分 , 并对这些静态变量进行 默认值赋值 , 一般赋值 0 , null 等默认值 ; 即使静态变量 static int a = 5 已经有了赋值 , 但是在该阶段暂时给该静态变量赋值 0 ;
  • 解析 : 将 " 常量池 " 中的 " 符号引用 " 转为 " 直接引用 " ;
    符号引用 : 下面就是 常量池中的 符号引用 , 引用是 以符号的形式表示出来 的 , 这并不是内存中的引用 ; 直接引用 是 将 #1 = Methodref #4.#17 样式的 符号引用 转为 指向内存地址指针引用 ; JVM 线程栈栈帧 中的 动态链接 , 就是持有的一个指向内存的指针 , 该指针指向 栈帧 对应方法 在运行时 常量池中的 内存地址 ; 该内存地址是在 方法区 中的 ;
Constant pool:
   #1 = Methodref          #4.#17         // java/lang/Object."<init>":()V
   #2 = Fieldref           #3.#18         // Student.name:Ljava/lang/String;
   #3 = Class              #19            // Student
   #4 = Class              #20            // java/lang/Object

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


3、初始化


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

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




总结

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

在这里插入图片描述

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值