java类加载(未完)

加载过程

java类的加载过程总共分为七部,分别是加载、验证、准备、解析、初始化、使用和卸载这7个阶段,现在我们只说明前面5个阶段。
这里写图片描述
其中,加载、验证、准备、初始化、卸载的先后顺序是确定的,而解析阶段则不一定。在某些情况下,解析阶段可以在初始化之后再开始。

加载

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

非数组类加载,程序员可以用自己创建的类加载器去加载,也可用java自带的加载器加载,而数组类本身不同类加载器创建,它是由java虚拟机直接创建的,但是数组类的元素类型最终是要通过类加载器去创建,一个数组类创建遵循以下过程:

如果数组的元素类型是引用类型,那么递归的采用如上所示的类加载过程去加载。

加载阶段和连接阶段的部分内容是交叉进行的,加载内容还没有完全结束,验证内容就开始了,但是这些内容都属于验证内容
验证
验证是连接阶段第一步,这一阶段的目的就是为了确保Class文件的字节流中包含的信息符合大年虚拟机的要求,并且不会危害虚拟机自身的安全。验证过程大致分为以下四种
文件格式验证
验证字节流时候符合Class文件格式的规范,并且能被当前版本的虚拟机处理。验证点包括:主次版本号是否在当前虚拟机处理范围之内,数据的编码,常量池中的常量是否有不被支持的类型等等

元数据验证
对字节码描述的信息进行语义分析,以保证其描述信息符合java语言规范的要求,验证点如下:
这个类是否有父类,是否允许继承,是不是抽象类,等等

字节码验证
最为复杂的一个阶段,主要是通过数据流和控制流分析确定成语语义是合法的,符合逻辑的,这个阶段将对类的方法体进行校验分析,保证被校验的类不会在运行时做出危害虚拟机安全的事件。
一些逻辑错误在这个阶段是不能被发现的,
符号引用验证
组后一个阶段的验证发生在虚拟机将符号引用转化为直接引用的时候,这个转动动作将在连接的第三阶段,解析阶段发生。符号验证可以看做是对类自身以外的信息进行匹配性校验,确保解析动作能正常执行。
准备
准备阶段是正式为类变量分配内存的并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。这个阶段分配的是类变量的内存(被static修饰的变量),而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在java堆中。

public static int value = 123;

在准备阶段,只是将value的值申明为0,等到初始化阶段,才会将123赋值给value。
解析
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,
符号引用:以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可,复活引用与虚拟机实现的内存布局无关,引用的目标不一定能加载到内存中。各种虚拟机实现的内存布局可以各不相同,但是他们能接受 的符号引用必须都是一致的,因为符号引用的字面量形式明确定义在java虚拟机规范的Class文件格式中
真实引用:是直接指向目标的指针、相对偏移量或是一个能简介定位到目标的句柄。直接引用是和虚拟机实现的内存布局相关的,同一个符号引用在不同虚拟机实力上翻译出来的直接引用议案不会相同。如果有了直接引用,那引用的目标必定已经在内存中了。
初始化

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值