JVM类的加载过程

27 篇文章 0 订阅
2 篇文章 0 订阅

JVM类的加载过程

从全局维度观察类的加载过程

在这里插入图片描述

类的加载过程一般可以划分为:加载阶段 Loading链接阶段 Linking初始化阶段 Initialization

IDEA安装插件jclasslib bytecode viewer即可查看反编译后的字节码文件

加载阶段

就是如何获取字节码文件的阶段

  1. 通过一个类的权限定名获取定义此类的二进制字节流
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构(元数据)
  3. 内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口

类加载器分类

加载.Class文件的方式

  • 从本地系统中直接加载
  • 从网络获取(Web Applet)
  • 从压缩包中读取(jar、war)
  • 运行时计算生成(动态代理技术)
  • 由其他文件生成(JSP应用)

链接阶段

验证(Verify)

  • 检查.Class文件的字节流中的信息是否符合当前虚拟机要求,保证被加载类的正确性,不会危害虚拟机自身安全

  • 主要包括四种验证:文件格式验证,元数据验证,字节码验证,符号引用验证

    例:开头为 CA FE BA BE 的十六进制数

准备(Prepare)

  • 为类变量分配内存并且设置该类变量的默认初始化(即为零值)
  • 注:此处不包含用final修饰的static变量,因为final在编译时就已经分配好了,准备阶段会显式初始化
  • 这里不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一起分配到Java堆中

解析(Resolve)

将使用到的其他类(例如System、父类)在常量池中的引用转换为直接引用供自己使用

  • 将常量池中的符号引用转换为直接引用的过程
  • 解析操作是在JVM完成初始化后再执行

初始化阶段

  • 初始化阶段就是执行类构造器方法<linit>()的过程(注:()不等同于类的构造器,类的构造器是())
  • 此方法()自动生成,不需定义,由javac编译器自动手机类中所有类变量的赋值动作和静态代码块中的语句合并而来
  • 构造器方法中指令按语句在源文件中出现的顺序执行。
  • 若该类有父类,JVM会保证在子类的执行前,父类的已经执行完毕
  • 虚拟机必须保证一个类的方法在多线程下被同步加锁
<init> // 是我们的构造器函数,初始化类内部变量???
main  // main函数
<clinit> // cl:class, init:initialization  负责静态变量的初始化和赋值,没有静态变量则没有这个方法

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

资料参考:B站尚硅谷

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值