类加载机制

类加载机制

java - jvm 类加载机制

Created with Raphaël 2.1.0 loading verification preparation resolution initialization using unloading

7个阶段

加载 loading

该阶段基本需要完成的事情:
通过一个类的全限定名(绝对路径)定义这个类的二进制流
将这个字节流代表的静态存储结构转化成方法区的运行时数据结构
在java堆中生成一个class对象作为方法区数据的访问入口

验证 verification

安全性验证一般有4个阶段的检查:
文件格式验证 Class文件魔数的值为0xCAFEBABE,主次版本号是否在处理范围内(major,minor)
元数据验证   对字节码描述的信息(类的元数据Metadata)进行语义规则分析验证
字节码验证   对数据流和控制流验证分析,保证类方法再运行时不会出错
符号引用验证 对类以外的信息进行校验如(符号引用中通过字符串描述的全限定名是否能找到对应的类、指定的类中是否存在符合描述符与简单名称描述的方法与字段)

准备 preparation

在准备阶段为类变量(static修饰的变量)分配内存,并设置类变量初始值。
特别提及(这些内存都将在方法区分配):
该阶段进行内存分配的仅包括类变量,不包括实例变量,实例变量将在对象初始化时随对象一起分配在堆内存中
这里所说的初始值“通常情况下”是指数据类型的零值

解析 resolution

该阶段为虚拟机将常量池内的符号引用替换为直接引用。在类初始化之前,解析操作只能解析静态绑定的符号引用
虚拟机规范并未规定解析动作发生的具体时间,仅要求在执行anewarray、checkcast、getfield、getstatic、instanceof、invokeinterface、invokespecial、invokestatic、invokevirtual、multianewarray、new、putfield和putstatic这13个用于操作符号引用的字节码指令之前,先对它们所使用的符号引用进行解析
符号引用:以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。符号引用与虚拟机实现的内存布局无关,引用的目标并不一定已经加载到内存中。
直接引用:可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。直接引用是和虚拟机实现的内存布局相关的,同一个符号引用在不同虚拟机实例上翻译出来的直接引用一般不会相同。如果有了直接引用,那引用的目标必定已经在内存中存在。

初始化 initialization

虚拟机规范要求只有以下几种情况触发类的初始化,其它在使用前才进行初始化:
使用new实例化对象、获取或者设置一个静态字段(final修饰除外)、调用静态方法
使用反射调用时需要先初始化
初始化一个类如果父类为未初始化先初始化父类
虚拟机启动时,用于执行的包含main方法的类需要先初始化
使用动态语言支持时,如果解析结果引用的类没有进行初始化,则需要先初始化

使用 using

卸载 unloading

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值