虚拟机类加载机制
2020-06-23 20:36:53 29 举报
AI智能生成
虚拟机类加载机制
作者其他创作
大纲/内容
什么是类加载
加载什么
加载class文件,无论以何种形式存在,只要是符合条件的二进制字节流
磁盘文件
网络传输
etc
为什么需要类加载
class文件只有被加载才能使用
啥时候进行类加载
运行期间
类加载分几步,不一定严格按照顺序
1.加载
1.1 通过类的全限定名获取此类的二进制字节流 B
1.2 将B的<b>静态存储结构</b>转化为<b>方法区的运行时数据结构</b>
1.3 在内存中生成一个代表这个<b>类</b>的java.lang.<b>Class</b>对象,此对象作为1.2中运行时数据结构的访问入口
结果:B以虚拟机所需的格式存储在<b>方法区</b>中
连接
2.验证
验证B是否符合要求,没有恶意代码损害JVM
2.1 文件格式验证,要符合class文件格式要求,见https://www.processon.com/mindmap/5d458174e4b01ed2c6ac2cd3
2.2 元数据验证,即语义分析
比如此类是否有父类
如果此类不是抽象类,那是否实现了父类或者接口中要求实现的方法
类的字段和方法是否与父类矛盾
2.3 字节码验证,通过数据流和控制流分析,确定程序运行期间不会对JVM有害
2.4 符号引用验证
比如,这个全限定名字符串代表的类 <b>C</b> 能否被找到
找到了这个类 <b>C</b>,那C的字段和方法是否符合B中所描述的那样
或者,字段和方法能否被B访问,比如private,public等等
3.准备
为<b>static变量</b>在<b>方法区</b>中<b>分配内存并初始化,</b>注意3点
1.不包括实例变量,实例变量将在对象实例化时随着对象一起分配在堆中
2.<b>通常情况下,</b>初始化为零值,比如public static int value = 123,<br>在<b>准备阶段后的初始值为0</b>,而123这个值是在<b>程序编译后由类构造器</b>中赋的
3<b>.特殊情况下,</b>当字段的<b>字段属性表</b>里存在<b>ConstantValue属性</b>时,则初始化为此属性的值<br>如:public static final int value = 123,则在<b>准备阶段后的初始值为123</b>
4.解析
把<b>常量池</b>中的<b>符号引用</b>替换为<b>直接引用</b>
类或接口的解析
字段解析
类方法解析
接口方法解析
解析发生的时机:执行<b>操作符号引用的字节码指令</b>之前<b>,</b>对其使用的符号引用进行解析
ps:
符号引用:用符号描述所引用的目标,符号可以是任何形式的字面量。<br>与JVM内存布局无关,目标不一定已经在内存中。
直接引用:直接指向目标的指针、相对偏移量、句柄等<br>与JVM内存布局相关,目标必然已经在内存中
总之,符号引用就像是:我要引用一个名叫a,类型为A的目标。<br>而直接引用:这个目标在内存单元0x5A3,见<br>https://www.zhihu.com/question/30300585/answer/51313752
5.初始化
<b>真正执行类中定义的Java程序代码</b>
6.使用
7.卸载
类加载器
以下接口、类统称为类
0 条评论
下一页