拉勾Java工程师P7训练营 高薪笔记

本文详细阐述了Java虚拟机(JVM)的类加载过程,包括加载、链接(验证、准备、解析)、初始化等阶段。讲解了每个阶段的目的和具体操作,如验证类文件的正确性、为类变量分配内存、符号引用的解析以及静态代码块的执行等。了解这些过程对于深入理解JVM的工作原理至关重要。
摘要由CSDN通过智能技术生成

类加载过程

 

加载模块
1.通过完全限定类获取定义该类的二进制字节流;
2.将该字节流表示的静态存储结构转换为方法区的运行时数据;
3.生成一个java。lang.Class对象,它表示类,并充当类在方法区域中的各种数据的访问点
链接到模块
验证
1.确保类文件中的字节流满足当前VM的要求,确保加载的类的正确性,并且不影响VM的安全性。
2.主要包括四种验证:文件格式验证、源数据验证、字节码验证、符号引用验证。
准备
1.为类变量分配内存,并将类变量的默认初始值设置为零。
不包括带有final的Static,因为final在编译时分配,并在准备过程中显式初始化。
类变量在方法区域中分配,而实例变量在Java堆中与对象一起分配。
解析
1.将常量池中的符号引用转换为直接引用的过程。
2.实际上,解析操作是在初始化后用JVM执行的
3.符号参照是描述被参照对象的一组符号。符号应用程序的文字形式在Java虚拟机规范的类文件格式中有明确定义。直接引用是直接指向目标的指针、相对偏移量或间接指向目标的句柄
4.解析操作主要针对类或接口、字段、类方法、接口方法和方法类型。常量池中的常量类信息、常量字段参考信息和常量方法参考信息。
初始化模块
1.Clinit()是类或接口初始化方法。请注意,它不是构造函数init()。
2.这个方法不需要定义,它是静态代码块中的语句和Java编译器为类中的所有类变量自动收集的赋值操作的组合。
3.我们注意到,如果没有静态变量C,字节码文件中就不会有Clinit方法
构造函数方法Clinit()中的指令按照语句在源文件中出现的顺序执行
虚拟机必须确保一个类的Clinit()方法在多个线程中同步锁定,这意味着一个类在其内部信息存储到方法区域之前只需要Clinit一次。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值